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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式...

發(fā)布時(shí)間:2023/11/29 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
責(zé)任鏈模式 一個(gè)請(qǐng)求有多個(gè)對(duì)象來(lái)處理,這些對(duì)象是一條鏈,但具體由哪個(gè)對(duì)象來(lái)處理,根據(jù)條件判斷來(lái)確定,如果不能處理會(huì)傳遞給該鏈中的下一個(gè)對(duì)象,直到有對(duì)象處理它為止 使用場(chǎng)景 1)有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求待運(yùn)行時(shí)刻再確定 2)在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求 3)可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求,客戶端可以動(dòng)態(tài)創(chuàng)建職責(zé)鏈來(lái)處理請(qǐng)求 public class Chain {public abstract class Handler {private Handler nextHandler;// 當(dāng)前領(lǐng)導(dǎo)能審批通過的最多天數(shù)public int maxDay;protected Handler(int maxDay) {this.maxDay = maxDay;}//設(shè)置責(zé)任鏈中下一個(gè)處理請(qǐng)求的對(duì)象public void setNextHandler(Handler handler) {nextHandler = handler;}protected void handleRequest(int day) {if (day <= maxDay) {reply(day);} else {if (nextHandler != null) {//審批權(quán)限不夠,繼續(xù)上報(bào)nextHandler.handleRequest(day);} else {System.out.println("沒有更高的領(lǐng)導(dǎo)審批了");}}}protected abstract void reply(int day);}class ProjectManager extends Handler {public ProjectManager(int day) {super(day);}@Overrideprotected void reply(int day) {System.out.println(day + "天請(qǐng)假,項(xiàng)目經(jīng)理直接審批通過");}}class DepartmentManager extends Handler {public DepartmentManager(int day) {super(day);}@Overrideprotected void reply(int day) {System.out.println(day + "天請(qǐng)假,部門經(jīng)理審批通過");}}class GeneralManager extends Handler {public GeneralManager(int day) {super(day);}@Overrideprotected void reply(int day) {System.out.println(day + "天請(qǐng)假,總經(jīng)理直接審批通過");}}public static void main(String[] strings) {Chain chain = new Chain();Handler projectManager = chain.new ProjectManager(3);Handler departmentManager = chain.new DepartmentManager(5);Handler generalManager = chain.new GeneralManager(15);//創(chuàng)建職責(zé)鏈projectManager.setNextHandler(departmentManager);departmentManager.setNextHandler(generalManager);//發(fā)起請(qǐng)假請(qǐng)求projectManager.handleRequest(4);} }

  

Buidler(建造者)模式 一種創(chuàng)建型的設(shè)計(jì)模式.,通常用來(lái)將一個(gè)復(fù)雜的對(duì)象的構(gòu)造過程分離, 讓使用者可以根據(jù)需要選擇創(chuàng)建過程.另外, 當(dāng)這個(gè)復(fù)雜的對(duì)象的構(gòu)造包含很多可選參數(shù)時(shí), 也可以使用建造者模式
public class AlerDialog {private String title;private String message;public AlerDialog(Builder builder) { // View.inflate()this.title = builder.title;this.message = builder.message;}public static class Builder {private String title;private String message;public Builder setTitle(String title) {this.title = title;return this;}public Builder setMessage(String message) {this.message = message;return this;}public AlerDialog build() {return new AlerDialog(this);}} }new AlerDialog.Builder().setTitle("").setMessage("").build();

  

?

適配器模式: 把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起使用的類能夠一起工作。?  適配器就是一種適配中間件,它存在于不匹配的二者之間,用于連接二者,將不匹配變得匹配,簡(jiǎn)單點(diǎn)理解就是平常所見的轉(zhuǎn)接頭,轉(zhuǎn)換器之類的存在。

?


類適配器 原理:通過繼承來(lái)實(shí)現(xiàn)適配器功能。 類適配器使用對(duì)象繼承的方式,是靜態(tài)的定義方式? 對(duì)于類適配器,適配器可以重定義Adaptee的部分行為,使Adaptee有了sampleOperation2() 對(duì)于類適配器,僅僅引入了一個(gè)對(duì)象,并不需要額外的引用來(lái)間接得 到 Adaptee? 對(duì)于類適配器,由于適配器直接繼承了Adaptee,使得適配器不能和 Adaptee的子類一起工作? public interface Target {void sampleOperation1();void sampleOperation2(); } public class Adaptee {public void sampleOperation1() {System.out.println("sampleOperation1");} } public class Adapter extends Adaptee implements Target {@Overridepublic void sampleOperation2() {System.out.println("sampleOperation2");}} public class MyClass {public static void main(String[] args) {Adapter adapter = new Adapter();adapter.sampleOperation1();adapter.sampleOperation2();} }

  


對(duì)象適配器 與類的適配器模式一樣,對(duì)象的適配器模式把被適配的類的API轉(zhuǎn)換成為目標(biāo)類的API,與類的適配器模式不同的是,對(duì)象的適配器模式不是使用繼承關(guān)系連接到Adaptee類,而是使用委派關(guān)系連接到Adaptee類。 對(duì)象適配器使用對(duì)象組合的方式,是動(dòng)態(tài)組合的方式 對(duì)于對(duì)象適配器,一個(gè)適配器(adaptee)可以把多種不同的源適配到同一個(gè)目標(biāo) 對(duì)于對(duì)象適配器,要重定義Adaptee的行為比較困難 對(duì)于對(duì)象適配器,需要額外的引用來(lái)間接得到Adaptee。
public interface Target {void sampleOperation1();void sampleOperation2(); }public class Adaptee {public void sampleOperation1() {System.out.println("sampleOperation1");} }public class Adapter implements Target {private Adaptee mAdaptee;public Adapter(Adaptee adaptee) {mAdaptee = adaptee;}@Overridepublic void sampleOperation1() {mAdaptee.sampleOperation1();}@Overridepublic void sampleOperation2() {System.out.println("sampleOperation2");}}public class MyClass {public static void main(String[] args) {Adapter adapter =new Adapter(new Adaptee());adapter.sampleOperation1();adapter.sampleOperation2();} }

  

? 代理模式 通過代理對(duì)象訪問目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,擴(kuò)展目標(biāo)對(duì)象的功能。在調(diào)用這個(gè)方法前作的前置處理(統(tǒng)一的流程代碼放到代理中處理)。調(diào)用這個(gè)方法后做后置處理。
這里使用到編程中的一個(gè)思想:不要隨意去修改別人已經(jīng)寫好的代碼或者方法,如果需改修改,可以通過代理的方式來(lái)擴(kuò)展該方法。 動(dòng)態(tài)代理的用途與裝飾模式很相似,就是為了對(duì)某個(gè)對(duì)象進(jìn)行增強(qiáng)。所有使用裝飾者模式的案例都可以使用動(dòng)態(tài)代理來(lái)替換。 /*** subject(抽象主題角色):* 真實(shí)主題與代理主題的共同接口。*/ interface Subject {void sellBook(); }/*** ReaISubject(真實(shí)主題角色):* 定義了代理角色所代表的真實(shí)對(duì)象。*/ public class RealSubject implements Subject {@Overridepublic void sellBook() {System.out.println("出版社賣書");} }/*** Proxy(代理主題角色):* 含有對(duì)真實(shí)主題角色的引用,代理角色通常在將客* 戶端調(diào)用傳遞給真實(shí)主題對(duì)象之前或者之后執(zhí)行某些* 操作,而不是單純返回真實(shí)的對(duì)象。*/ public class ProxySubject implements Subject {private RealSubject realSubject;@Overridepublic void sellBook() {if (realSubject == null) {realSubject = new RealSubject();}sale();realSubject.sellBook();give();}public void sale() {System.out.println("打折");}public void give() {System.out.println("送優(yōu)惠券");} }public class Main {public static void main(String[] args) {//靜態(tài)代理(我們自己靜態(tài)定義的代理類)ProxySubject proxySubject = new ProxySubject();proxySubject.sellBook();//動(dòng)態(tài)代理(通過程序動(dòng)態(tài)生成代理類,該代理類不是我們自己定義的。而是由程序自動(dòng)生成)RealSubject realSubject = new RealSubject();MyHandler myHandler = new MyHandler();myHandler.setProxySubject(realSubject);Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(), myHandler);subject.sellBook();} }public class MyHandler implements InvocationHandler {private RealSubject realSubject;public void setProxySubject(RealSubject realSubject) {this.realSubject = realSubject;}/*** @param proxy  指代我們所代理的那個(gè)真實(shí)對(duì)象* @param method 指代的是我們所要調(diào)用真實(shí)對(duì)象的某個(gè)方法的Method對(duì)象* @param args  指代的是調(diào)用真實(shí)對(duì)象某個(gè)方法時(shí)接受的參數(shù)* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {sale();proxy = method.invoke(realSubject, args);give();return proxy;}public void sale() {System.out.println("打折");}public void give() {System.out.println("送優(yōu)惠券");} }

  

享元模式 享元的目的是為了減少不會(huì)要額內(nèi)存消耗,將多個(gè)對(duì)同一對(duì)象的訪問集中起來(lái),不必為每個(gè)訪問者創(chuàng)建一個(gè)單獨(dú)的對(duì)象,以此來(lái)降低內(nèi)存的消耗。 public class FlyWeight {static class MyString {private String myChar;public MyString(String myChar) {this.myChar = myChar;}public void display() {System.out.println(myChar);}}static class MyCharacterFactory {private Map<String, MyString> pool;public MyCharacterFactory() {pool = new HashMap<>();}public MyString getMyCharacte(String strig) {MyString myString = pool.get(strig);if (myString == null) {myString = new MyString(strig);pool.put(strig, myString);}return myString;}}public static void main(String[] args) {MyCharacterFactory myCharacterFactory = new MyCharacterFactory();MyString a = myCharacterFactory.getMyCharacte("a");MyString b = myCharacterFactory.getMyCharacte("b");MyString a1 = myCharacterFactory.getMyCharacte("a");MyString d = myCharacterFactory.getMyCharacte("d");if (a == a1) {System.out.println("true");}} }

  

相關(guān)源碼:https://github.com/peiniwan/DesignPattern.git

轉(zhuǎn)載于:https://www.cnblogs.com/sixrain/p/9021641.html

總結(jié)

以上是生活随笔為你收集整理的用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。