设计模式:常见模式案例
生活随笔
收集整理的這篇文章主要介紹了
设计模式:常见模式案例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
1.觀察者模式
package 觀察者模式.實現1;import 觀察者模式.實現2.ConcreteObserver; import 觀察者模式.實現2.Observer;public class ConcreteSubject extends Subject {private String state;public void change(String newState){state=newState;this.notifyObserver();}} class test{private static ConcreteSubject subject;private static Observer observer;public static void main(String[] args) {//創建觀察者對象subject=new ConcreteSubject();//創建主題對象observer=new ConcreteObserver();//觀察者對象登記到主題對象上subject.attach(observer);//改變主題對象的狀態subject.change("new State");} }package 觀察者模式.實現1;import java.util.Enumeration; import java.util.Vector;import 觀察者模式.實現2.Observer;public abstract class Subject {private Vector observersVector=new Vector(); public void attach(Observer o) {observersVector.addElement(o);}public void detach(Observer o) {observersVector.removeElement(o);}public void notifyObserver() {Enumeration enumeration=observers();while(enumeration.hasMoreElements()){((Observer)enumeration.nextElement()).update();}}public Enumeration observers(){return ((Vector)observersVector.clone()).elements();}/*方案2:主題對象的功能必須由一個java聚集來維護一個對所有的觀察者對象的引用* 管理這個聚集的方法是由抽象主題角色來聲明并具體主題角色來實現導致了具體主題角色* 到抽象觀察者角色的連線* 問題:聚集的管理方法在每一個具體角色上都不同嗎?* 聚集管理方法本身是所有具體主題角色所共有的,因而這些聚集管理方法本身就是所有具體主題角色所共有的,因而* 這些方法以及聚集本身都可以移到抽象主題角色上去,notifyObserver()依賴聚集對象也可以用的移到抽象* 主題角色上去--方案1* * 區別:代表存儲觀察者對象的聚集連線是從抽象主題到抽象觀察者** */ }package 觀察者模式.實現2;public class ConcreteObserver implements Observer{/*具體主題對象可以動態的維護一系列的對觀察者對象的引用,并在需要的時候調用每一個觀察者共有的方法:* 從具體的主題角色指向觀察者角色的合成關系,代表具體主題可以有任意多個對抽象觀察者的引用。* */public void update() {System.out.println("我正在......");}}package 觀察者模式.實現2;import java.util.Enumeration; import java.util.Vector;public class ConcreteSubject implements Subject{private Vector observersVector=new Vector(); //聚集public void attach(Observer o) {observersVector.addElement(o);}public void detach(Observer o) {observersVector.removeElement(o);}public void notifyObserver() {Enumeration enumeration=observers();while(enumeration.hasMoreElements()){((Observer)enumeration.nextElement()).update();}}public Enumeration observers(){return ((Vector)observersVector.clone()).elements();}}package 觀察者模式.實現2; /*內涵:定義了一種一對多的依賴關系,讓多個觀察者同時監聽某一主題對象,當這個主題對象發生變化時會通知* 所有的觀察者對象,使他們能自動更新自己* --某個對象發生改變時其他對象能做出相應的改變* */ public interface Observer {/*角色:* 抽象主題(subject)角色:將所有觀察者對象的引用保存在一個聚集(如:vector),每個主題都可以有* 任意數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象(抽象被觀察者角色)* 抽象觀察者角色:為所有具體的觀察者定義一個接口,在得到主題更新時通知自己;這個接口叫更新接口,抽象* 觀察者角色一般用一個抽象類或接口實現* 具體主題角色:將有關狀態存入具體觀察者對象;在具體主題內部改變時;給所有觀察者發出通知;具體主題角色* 又叫具體被觀察者角色。具體主題角色實現對觀察者引用聚集的管理方法* 具體觀察者角色:存儲與主題狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使* 本身狀態與主題的狀態相協調。如果需要具體觀察者可以保存一個指向具體主題對象的引用* */void update();}package 觀察者模式.實現2;public interface Subject {//登記一個新的觀察者對象public void attach(Observer o);//刪除一個已經登記過的觀察者對象public void detach(Observer o);//通知所有登記過的觀察者對象void notifyObserver();}2.門面模式
package 門面模式;public class Alarm {public void activate(){System.out.println("啟動警報器");}public void deactivate(){System.out.println("關閉警報器");}public void runing(){System.out.println("拉響警報器");}public void stopRing(){System.out.println("停掉警報器");}}package 門面模式;public class Camera {public void turnOn(){System.out.println("打開錄像機");}public void turnOff(){System.out.println("關閉錄像機");}public void rotate(int degrees){System.out.println("轉動錄像機"+degrees+"");}} package 門面模式;public class Light {public void turnOn(){System.out.println("開燈");}public void turnoff(){System.out.println("關燈");}public void changeBulb(){System.out.println("換燈泡啦......");}}package 門面模式; /*門面角色:此角色知道相關(一個或多個)子系統的功能和責任,在正常的情況下,本角色會將所有的請求委派到相應的子系統* 子系統角色:可以同時擁有一個或多個子系統,每個子系統都是一個類的集合,都可以被客戶端或門面調用,對子系統而言門面* 只是另一個客戶端而已* */ public class SecurityFacade {//門面類/*內涵:* 為一個復雜的子系統提供一個簡單的接口:可以提高代碼的復用性* 子系統的獨立性* 層次化結構:簡化了層與層之間的依賴關系* */private Camera camera1,camera2;private Light light1,light2,light3;private Sensor sensor;private Alarm alarm;public void trunOn(){camera1.turnOn();camera2.turnOn();light1.turnOn();light2.turnOn();light3.turnOn();sensor.activate();alarm.activate();}public void deavtivate(){camera1.turnOff();camera2.turnOff();light1.turnoff();light2.turnoff();light3.turnoff();sensor.deactivate();alarm.deactivate();}} package 門面模式;public class Sensor {public void activate(){System.out.println("啟動感應器");}public void deactivate(){System.out.println("關閉感應器");}public void trigger(){System.out.println("觸發感應器");}}3.橋梁模式
package 橋梁模式; /*橋梁模式有助于理解"開閉原則","合成/聚合原則"*橋梁模式的用意是將抽象化與實現化脫耦,使他們可以獨立的變化*1.抽象化:存在于多個實體之間的共同的概念性聯系* 在過程上,抽象化就是忽略一些信息,把不同實體當做相同實體看待 例:共同類、抽象類、繼承關系*2.實現化:抽象化給出的具體實現*3.脫耦:將兩個實體行為的某種關聯,而將他們的強關聯去掉。* 強關聯:編譯期已經確定,無法再運行時動態改變的關聯* 弱關系:可以在運行期動態確定并且動態改變的關聯* 例:繼承關系是強關聯,聚合關系是弱關聯* */ public abstract class Abstraction {//抽象化角色/*角色:* 抽象化角色:抽象化給出定義,并保存一個對實現化對象的引用* 修正抽象化角色:擴展抽象化角色,改變和修正父類對抽象化的定義* 實現化角色:給出實現化的接口,但不給出具體的實現;這個接口不一定與抽象化接口相同。實現化角色應該給出* 底層操作,而抽象化角色應該給出更高一層的操作* 具體實現化角色:給出實現化接口的具體實現* */protected Implementor imp;public void operation(){imp.operationImp();//抽象化角色可以向不同實現化對象委派,來達到動態轉換自己功能的目的//抽象化角色的接口比實現化角色的接口更寬,抽象化角色除了提供與實現化角色相關的方法之外//還有可能提供其他商業方法,而實現化角色則往往為實現抽象化角色的相關行為而存在}}package 橋梁模式; //具體實現化角色 public class ConcreteImplementor extends Implementor{@Overridepublic void operationImp() {System.out.println("Do something......");}}package 橋梁模式; //實現化角色 public abstract class Implementor {public abstract void operationImp();}package 橋梁模式; //修正抽象化角色 public class RefindAbstraction extends Abstraction{@Overridepublic void operation() {// TODO Auto-generated method stubsuper.operation();}}4.裝飾模式
package 裝飾模式; /*抽象構件角色* */ public interface Compent {/*抽象構件:給出一個抽象接口,以規范準備接收附加責任的對象* 具體構件:定義一個將要接收附加責任附件的類* 裝飾角色:持有一個構件對象的實例,并定義一個與抽象構件接口一致的接口* 具體裝飾角色:負責給構件對象貼上附加責任* */void sampleOperation();/*裝飾模式的使用:* 需要擴展一個類的功能,或者給一個類增加附加功能* 需要動態的給一個對象增加功能,這些功能可以動態的撤銷* 需要增加一些基本功能的排列組合而產生非常大的功能,從而使繼承關系變得不現實* */}package 裝飾模式; //具體構件類 public class ConcreteCompent implements Compent {public void sampleOperation() {// TODO Auto-generated method stub}}package 裝飾模式; //具體裝飾類 public class ConcreteDecroator extends Decrorator{public ConcreteDecroator() {super();// TODO Auto-generated constructor stub}public ConcreteDecroator(Compent com) {super(com);// TODO Auto-generated constructor stub}@Overridepublic void sampleOperation() {// TODO Auto-generated method stubsuper.sampleOperation();}}class test{public static void main(String[] args) {Compent com=new ConcreteCompent();//創建一個真實的對象Compent dec=new ConcreteDecroator(com);//裝飾的變化--所有的變化都是由真實對象操作} }package 裝飾模式; //裝飾角色 public class Decrorator implements Compent {/*內涵:Decrorator本身不是一個抽象類,在實際應用中也不一定是抽象類,但是他的功能是一個抽象的角色,因而* 稱為抽象裝飾 例 大圣的72般變化* */private Compent compent;public Decrorator(Compent com){this.compent=com;}public Decrorator(){}public void sampleOperation() {compent.sampleOperation();}}?
轉載于:https://my.oschina.net/wii01/blog/983739
總結
以上是生活随笔為你收集整理的设计模式:常见模式案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop学习;datajoin;ch
- 下一篇: ZOJ 1696 Viva Confet