觀察者模式和訪問者模式


前言:訪問者是主動的,觀察者是被動的,但是它們的處理過程都類似責任鏈模式,都是可以保證順序性執行。

一:觀察者模式 

       定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新

/** * 觀察者接口 */
public interface Observer { void registerObserver(ObserverBehavior o); void removeObserver(ObserverBehavior o); void notifyObserver(); } public interface ObserverBehavior { void update(String message); } /** * 模擬微信用戶表 */
public class WechatAccount implements ObserverBehavior{ WechatAccount(){} public WechatAccount(String name, String password) { this.name = name; this.password = password; } private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "WechatAccount{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}'; } @Override public void update(String message) { read(message); } public void read(String message) { System.out.println(name + " 收到推送消息: " + this.toString()); System.out.println(message); } } /** * @ClassName: ObserverPatternTest * @Description: 觀察者模式 * @Version: 1.0 * 業務場景:一個微信公眾號服務,不定時發布一些消息,關注公眾號就可以收到推送消息,取消關注就收不到推送消息 */
public class ObserverPatternTest implements Observer{ private static List<ObserverBehavior>  accountList = new ArrayList<>(); @Override public void registerObserver(ObserverBehavior o) { accountList.add(o); } @Override public void removeObserver(ObserverBehavior o) { if(!CollectionUtils.isEmpty(accountList)){ accountList.remove(o); } } @Override public void notifyObserver() { for(int i = 0; i < accountList.size(); i++) { ObserverBehavior oserver = accountList.get(i); oserver.update("微信服務更新消息:java是世界上最好的語言"); } } /** * 觀察者是被動的,通知者來告知觀察者的行為(此處的通知者 粗淺認為和訪問者模式中的訪問者類似) * @param args */
    public static void main(String[] args) { WechatAccount aaa = new WechatAccount("馬雲", "123456"); WechatAccount bbb = new WechatAccount("馬化騰", "123456"); ObserverPatternTest test = new ObserverPatternTest(); test.registerObserver(aaa); test.registerObserver(bbb); test.notifyObserver(); } } 

二:訪問者模式 

       需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,使用訪問者模式將這些封裝到類中。

//訪問者接口
public interface Visitor { void visitA(Element element); void visitB(Element element); } public class ConcreteVisitorA implements Visitor{ @Override public void visitA(Element element) { System.out.println("元素:"+element.getClass()); } @Override public void visitB(Element element) { System.out.println("元素:"+element.getClass()); } } public class ConcreteVisitorB implements Visitor{ @Override public void visitA(Element element) { System.out.println("元素:"+element.getClass()); } @Override public void visitB(Element element) { System.out.println("元素:"+element.getClass()); } } public abstract class Element { abstract void accept(Visitor visitor); } public class ConcreteElementOne extends Element{ public ConcreteElementOne() { } @Override void accept(Visitor visitor) { visitor.visitA(this); } } public class ConcreteElementTwo extends Element{ public ConcreteElementTwo() { } @Override void accept(Visitor visitor) { visitor.visitB(this); } } public class SwaggerElementObject { List<Element> eleList = new ArrayList<Element>(); public void add(Element element){ eleList.add(element); } public  void accept(Visitor visitor){ for (Element ele : eleList) { ele.accept(visitor); } } } /** * 訪問者模式測試代碼 */
public class VisitorTest { public static void main(String[] args) { SwaggerElementObject swagger = new SwaggerElementObject(); swagger.add(new ConcreteElementOne()); swagger.add(new ConcreteElementTwo()); //訪問者主動發起動作
               swagger.accept(new ConcreteVisitorA()); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM