前言:訪問者是主動的,觀察者是被動的,但是它們的處理過程都類似責任鏈模式,都是可以保證順序性執行。
一:觀察者模式
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新
/** * 觀察者接口 */
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()); } }