一方发生改变时通知多放进行相应的 *** 作
比如:
商人进货了,通知村民商品进货
微信公众号发文章了,通知所有关注者最新的消息
- 降低代码耦合度
- 增强扩展性
我认为设计模式是死的但是业务是灵活的,我们需要根据业务灵活使用设计模式,心中无模式代码有模式
观察者模式实践实现业务:
良民: 张三 李四 劫匪: 张麻子 观察卖大米商人的信息
张三 李四 监听到大米进货前去买大米
张麻子 监听到大米进货带着q前去零元购
两个接口
public interface IObserver { void setName(String name); void receive(String name, String msg); }
public interface ISubject { void setName(String name); void addObserver(IObserver observer); void notifyAllObservers(String msg); }
三个实现类
public class Merchant implements ISubject { ListobserverList = new ArrayList<>(); private String name; @Override public void setName(String name) { this.name = name; } @Override public void addObserver(IObserver observer) { observerList.add(observer); } public void addGoods(){ this.notifyAllObservers("大米进货了"); } @Override public void notifyAllObservers(String msg) { for (IObserver iObserver : observerList) { iObserver.receive(name,msg); } } }
public class People implements IObserver { private String peopleName; @Override public void setName(String name) { this.peopleName = name; } public void setObsName(String obsName) { this.peopleName = obsName; } @Override public void receive(String name, String msg) { // 接收到通知 System.out.println("良民: " + this.peopleName + "接收到" + name + "的消息: " + msg); // 张三行动 System.out.println(this.peopleName + ": 带钱去买大米"); } }
public class Robber implements IObserver { private String robberName; @Override public void setName(String name) { this.robberName = name; } @Override public void receive(String name, String msg) { // 接收到通知 System.out.println("劫匪: " + this.robberName + "接收到" + name + "的消息: " + msg); // 张三行动 System.out.println(this.robberName + ": 带着q前去零元购"); } }
进行单元测试
@Test public void test1() { Merchant m = new Merchant(); m.setName("卖大米的"); IObserver zhangSan = new People(); zhangSan.setName("张三"); m.addObserver(zhangSan); IObserver liSi = new People(); liSi.setName("李四"); m.addObserver(liSi); IObserver maZi = new Robber(); maZi.setName("张麻子"); m.addObserver(maZi); m.addGoods(); }
输出结果:
良民: 张三接收到卖大米的的消息: 大米进货了 张三: 带钱去买大米 良民: 李四接收到卖大米的的消息: 大米进货了 李四: 带钱去买大米 劫匪: 张麻子接收到卖大米的的消息: 大米进货了 张麻子: 带着q前去零元购
代码地址: giee
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)