博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于观察者设计模式实现的产品订购功能
阅读量:6969 次
发布时间:2019-06-27

本文共 2781 字,大约阅读时间需要 9 分钟。

本文所用代码链接:

一、观察者模式介绍

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

二、观察者模式的实现

三、在实现产品订购功能方向的应用

 1、Subject接口,带有绑定观察者到 Client 对象,从 Client 对象解绑观察者和通知观察者的方法。

1 public interface Subject {2 3     4     public void register(Observer observer);5     public void unregister(Observer observer);6     public void notifyObserver();7 }

2、Subject接口下的Product类,有一个 ArrayList 存放观察者(即订购者)们。

1 import java.util.ArrayList; 2  3 public class Product implements Subject { 4      5 private ArrayList
observes; 6 private int iphone; 7 private String Name; 8 private boolean Available; 9 10 11 12 public Product(){13 observes= new ArrayList
();14 }15 16 @Override17 public void register(Observer register) {18 observes.add(register);19 20 }21 22 @Override23 public void unregister(Observer unregister) {24 int index=observes.indexOf(unregister);25 System.out.println("Observer : " + (index+1) + "Deleted" );26 observes.remove(unregister);27 }28 29 @Override30 public void notifyObserver() {31 for(Observer observer: observes){32 observer.update(Name);33 }34 35 }36 37 public void setAvailable(boolean available){38 this.Available=available;39 if(available==true){40 notifyObserver();41 }42 }43 44 45 46 }

3、Observer接口

1 public interface Observer {2 3     public void update(int iphone);4     5 }

4、Observer接口下的Customer类,订购者订购产品。

1 public class Customer implements Observer { 2     private int iphone; 3     private static int observeridcount=0; 4     private int observerid; 5     private String Name; 6     private Subject product; 7      8     public Customer(Subject product){ 9         this.product= product;10         this.observerid=++observeridcount;11         System.out.println("New Observer" + observerid  );12         product.register(this);13     }14     15     @Override16     public void update(int iphone) {17         System.out.println("Iphone Available" + iphone);18         19     }20 21     22 }

5、程序入口

1 public class Main { 2  3     public static void main(String[] args) { 4          5         Product product = new Product(); 6         Customer customer = new Customer(product); 7          8         product.setIphone(1); 9 10     }11 12 }

四、观察者模式在本应用中的优点

优点: 1、观察者和被观察者是抽象耦合的,产品类和订购者类封装在独立的对象中使它们可以各自独立地改变和复用。

            2、建立了一套触发机制,产品对象的改变会通知到订购者们。

五、观察者模式的缺点

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

            2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 

            3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

转载于:https://www.cnblogs.com/stephanie727/p/9836031.html

你可能感兴趣的文章
成本维护不允许超过设定比例
查看>>
Android调用相机并将照片存储到sd卡上
查看>>
GridView 常用技巧
查看>>
[2017BUAA软工]个人阅读作业+总结
查看>>
Python--day65--模板语言之变量相关语法
查看>>
the simplest usage of the menu(Android Development)
查看>>
为什么处理排序的数组要比非排序的快
查看>>
游标的简单理解
查看>>
MySQL创建表的语句
查看>>
POJ-3260 The Fewest Coins
查看>>
【OpenStack】源码级深入了解删除虚拟机操作
查看>>
【转】Multithreaded Python Tutorial with the “Threadworms” Demo
查看>>
在vue项目中,将juery设置为全局变量
查看>>
广工校赛决赛之简单的数论题
查看>>
SpringBoot集成Mybatis
查看>>
实操记录
查看>>
Entity Framework 6.0 Tutorials(11):Download Sample Project
查看>>
LeetCode – Refresh – Read N Characters Given Read4
查看>>
LeetCode – Refresh – ZigZag Conversion
查看>>
SQLHelper用的不爽,试试CmdRunner吧
查看>>