日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

设计模式之反射与配置文件

發布時間:2025/6/15 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之反射与配置文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?為了滿足“開閉原則”,大部分設計模式都引入了抽象層,如工廠方法模式、抽象工廠模式、適配器模式、橋接模式、命令模式、策略模式等等。客戶端代碼針對抽象層編程,而在程序運行的時候再指定其子類,根據“里氏代換原則”和面向對象的多態性,子類對象在運行時將覆蓋父類對象。如果需要對系統進行擴展或修改,只需修改子類類名即可。在具體實現時,通過引入配置文件可以使得用戶在不修改任何客戶端代碼的前提下增加或替換子類,其基本實現過程如下:

????? (1)客戶端針對抽象層編程,客戶端代碼中不能出現任何具體類類名,即客戶端不直接實例化對象;

????? (2)引入純文本格式的配置文件,通常是XML文件,將具體類類名存儲在配置文件中;

????? (3)通過DOMDocument Object Model,文檔對象模型)、SAXSimple APIfor XML)等XML解析技術獲取存儲在配置文件中的類名;

????? (4)在客戶端代碼中通過反射(Reflection)機制根據類名創建對象,用反射所創建的對象替換父類對象的引用,程序運行時,將調用子類方法來實現業務功能;

????? (5)如果需要擴展功能,只需增加一個新的子類繼承抽象父類,再修改配置文件,重新運行程序即可;如果需要替換功能,只需用另一個子類類名替換存儲在配置文件中的原有子類類名即可。無論是擴展還是替換都無須修改既有類庫和客戶端源代碼,完全符合開閉原則。

????? 下面通過工廠方法模式來說明如何使用配置文件和反射機制:

【實例說明】:寶馬(BMW)工廠可以生產寶馬轎車,奔馳(Benz)工廠可以生產奔馳轎車,使用工廠方法模式來設計該場景,所得類圖如圖1所示:


1?工廠方法模式實例類圖

???????在圖1中,CarFactory是抽象工廠,聲明了工廠方法produceCar(),在其子類中實現了該方法,用于返回具體的產品。在客戶端代碼中將出現如下代碼:

CarFactory cf;

Car car;

cf? = new BMWFactory();? //創建具體工廠

car = cf.produceCar(); //使用工廠方法創建產品對象

car.run(); //調用產品的業務方法

????? 在上述代碼中,客戶端針對抽象層編程,但是在創建具體工廠的時候還是涉及到了具體工廠子類類名,注意加粗的代碼行。如果需要更換產品,如將BMW改為Benz,則需要更換工廠,要將BMWFactory改為BenzFactory,這將導致客戶端代碼發生修改。從客戶端的角度而言違反了開閉原則,因此需要對上述代碼進行改進。引入配置文件和反射機制是最佳的改進方法之一。

????? 首先,我們將具體工廠類類名存儲在如下XML文檔中:

<?xml version="1.0"?>

<config>

?????? <className>BMWFactory</className>

</config>

????? 該XML文檔即為配置文件,用于存儲具體類的類名。Spring等主流的業務層框架都使用了XML格式的配置文件。

????? 為了動態創建子類對象,我們需要再設計一個工具類XMLUtil用于讀取該XML配置文件,在此使用Java語言實現該工具類。在XMLUtil的設計中需要使用Java語言的兩個技術點,其一是DOM,即對XML文件的操作,關于DOM的詳細學習可以參考其他相關書籍和資料,在此不予擴展;其二是Java反射機制,下面對Java反射機制做一個簡單的介紹。

???? Java反射(Java Reflection)是指在程序運行時獲取已知名稱的類或已有對象的相關信息的一種機制,包括類的方法、屬性、父類等信息,還包 括實例的創建和實例類型的判斷等。在反射中使用最多的類是ClassClass類的實例表示正在運行的Java應用程序中的類和接口,其forName(StringclassName)方法可以返回與帶有給定字符串名的類或接口相關聯的?Class對象,再通過Class對象的newInstance()方法創建此對象所表示的類的一個新實例,即通過一個類名字符串得到類的實例。如創建一個字符串類型的對象,其代碼如下所示:

??? //通過類名生成實例對象并將其返回

??? Class c=Class.forName("String");

??? Object obj=c.newInstance();

??? return obj;

?????? 此外,在JDK中還提供了java.lang.reflect包,封裝了一些其他與反射相關的類,在本書中只用到上述簡單的反射代碼,在此不予擴展。

????? 通過引入DOM和反射機制后,可以在XMLUtil中實現讀取XML文件并根據存儲在XML文件中的類名創建對應的對象,XMLUtil類的詳細代碼如下:

import javax.xml.parsers.*;

import org.w3c.dom.*;

import org.xml.sax.SAXException;

import java.io.*;

public class XMLUtil

{

//該方法用于從XML配置文件中提取具體類類名,并返回一個實例對象

?????? public static? Object getBean()

?????? {

????????????? try

????????????? {

???????????????????? //創建DOM文檔對象

???????????????????? DocumentBuilderFactory? dFactory = DocumentBuilderFactory.newInstance();

???????????????????? DocumentBuilder? builder = dFactory.newDocumentBuilder();

???????????????????? Document? doc;????????????????????????????????????????????????

???????????????????? doc? = builder.parse(new File("config.xml"));

?????????????

???????????????????? //獲取包含類名的文本節點

???????????????????? NodeList? nl = doc.getElementsByTagName("className");

???????????????????? Node? classNode=nl.item(0).getFirstChild();

????????????????????String cName=classNode.getNodeValue();

??????????? ?

????????????????? ? //通過類名生成實例對象并將其返回

?????????????????? ?Class c=Class.forName(cName);

?????? ?? ??? ????? Object obj=c.newInstance();

??????????????????? return obj;

???????????????}??

??????????? ? catch(Exception e)

??????????? ? {

??????????? ???????? e.printStackTrace();

??????????? ???????? return null;

?????????? ? }

?????? }

}

????? 有了XMLUtil類后,我們在客戶端代碼中不再直接使用new關鍵字來創建具體的工廠類,而是將具體工廠類的類名存放在XML文件中,再通過XMLUtil類的靜態工廠方法getBean()方法進行對象的實例化,代碼修改如下:

CarFactory cf;

Car car;

cf? = (CarFactory)XMLUtil.getBean();//getBean()的返回類型為Object,此處需要進行強制類型轉換

car = cf.produceCar();

car.run();

????? 在C#中實現讀取配置文件和反射更為簡單,我們只需先增加一個XML格式的配置文件,如App.config,代碼如下所示:

<?xml version="1.0"? encoding="utf-8" ?>

<configuration>

?? <appSettings>

???? <add key="factory" value="Demo.CarFactory"/>

?? </appSettings>

</configuration>

????? 在.NET中反射生成對象也很簡單,由于在.NET的程序集中封裝了類型元數據信息,因此可以先通過AssemblyLoad("程序集名稱")方法加載一個程序集,再通過其CreateInstance("命名空間.")方法根據類名創建一個object類型的對象,用戶可以根據需要轉換為所需類型。示意代碼如下:

//導入命名空間

using System.Reflection;

object obj = Assembly.Load("程序集名稱").CreateInstance("命名空間.");

????? 在上述代碼中,“命名空間.類”可以存儲在配置文件中,使用ConfigurationManager類的AppSettings屬性可以獲取存儲在配置文件中的類名字符串。客戶端代碼如下所示:

CarFactory cf;

Car? car;

//讀取配置文件

string factoryStr =? ConfigurationManager.AppSettings["factory"];?

//反射生成對象,程序集名為Demo

cf? =?? (CarFactory)Assembly.Load("Demo").CreateInstance(factoryStr);?

car = cf.ProduceCar();

car.Run();

???????由于C++語言的特性,在C++中實現類似JavaC#來反射生成對象的過程相對較為復雜,感興趣的讀者可以參考其他相關資料,在此不予擴展。

????? 在引入配置文件和反射機制后,需要更換或增加新的具體類將變得很簡單,只需增加新的具體類并修改配置文件即可,無須對現有類庫和客戶端代碼進行任何修改,完全符合開閉原則。在很多設計模式中都可以通過引入配置文件和反射機制來對客戶端代碼進行改進,如在抽象工廠模式中可以將具體工廠類類名存儲在配置文件中,在適配器模式中可以將適配器類類名存儲在配置文件中,在策略模式中可以將具體策略類類名存儲在配置文件中等等。通過對代碼的改進,可以讓系統具有更好的擴展性和靈活性,更加滿足各種面向對象設計原則的要求。

總結

以上是生活随笔為你收集整理的设计模式之反射与配置文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲另类色综合网站 | 久草香蕉在线 | av视屏 | 午夜精品久久久久久久99黑人 | 91一级视频 | 99视频在线播放 | 日韩 欧美 精品 | 久久久888 | 福利一区二区在线观看 | 久草中文在线观看 | 欧美一级视频在线观看 | 97免费在线观看视频 | 二区欧美 | 国产做爰全过程免费视频 | 明星毛片 | 精品深夜av无码一区二区老年 | 国产色悠悠 | 午夜少妇视频 | 日日干日日操 | 欧美精品网站 | 97超碰自拍 | av天天草| 一区视频在线播放 | 日韩精品av一区二区三区 | 蜜桃av噜噜一区二区三区 | 日本视频免费看 | 好吊色欧美一区二区三区视频 | 成人精品自拍 | 久久国产情侣 | 嫩草影院菊竹影院 | 少妇高潮一区二区三区在线 | av老司机在线观看 | 国产欧美一区二区精品性色超碰 | av美女网站| 精品三级视频 | 中文字幕大全 | 男ji大巴进入女人的视频 | 欧美日本不卡 | 国产电影免费观看高清完整版视频 | 国产精品自产拍 | 国产精品福利一区二区三区 | 欧美精品久久久久久久 | 91私拍| 亚洲成人高清在线 | 激情无码人妻又粗又大 | 黑人3p波多野结衣在线观看 | 91在线观看. | 久久久久久久久久影院 | 久久欧洲 | 欧美爱爱视频 | 久草青青视频 | 神马午夜一区二区 | 人妻丰满熟妇岳av无码区hd | 中国黄色录像 | 97人人看| 锦绣未央在线观看 | 黄色小说视频 | 色秀视频在线观看 | www.亚洲一区二区 | 依人在线| 亚洲成人mv| 免费av一区二区 | 毛片视频观看 | 精品人妻一区二区三区浪潮在线 | 日韩精品久久久久久 | 男人与雌宠物交h | 久久久久久久女国产乱让韩 | 欧美日韩久久久久久 | 欧美专区在线播放 | 在线观看成人黄色 | 九九超碰 | 免费观看全黄做爰的视频 | 成人免费观看在线视频 | 蜜桃av在线| av在线中文 | 东北少妇不带套对白 | 免费黄色片子 | 国产另类ts人妖一区二区 | 一本高清dvd在线播放 | 亚洲www| 欧产日产国产精品 | 五月婷婷在线观看 | 一级黄色短片 | 中文字幕h | 99资源在线 | 日本三级黄色录像 | 欧美成人手机在线 | 日韩欧美一级片 | 国语对白对话在线观看 | 日本少妇高潮抽搐 | 福利一区在线 | 亚洲第一福利视频 | 生活片av| 久久不射网站 | 欧美精品第一页 | 黄a视频 | 丝袜诱惑一区二区 | 国产女主播一区 | 精品视频站长推荐 |