本篇文章继续来学习Java的设计模式,这篇文章来解析行为型模式种的几种比较常用的设计模式。
一、观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。以微信推送腾讯新闻为例,用户在微信订阅了腾讯新闻后,用户会收到腾讯的新闻推送。如果用户取消了新闻订阅,那么就不会再收到推送。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。
以订阅微信公众号为例:
用户在微信订阅了微信公众号后,会收到公众号的消息推送。如果用户取消了订阅,那么就不会再收到推送。
1.观察者Observer抽象层 观察者订阅公众号后会监听公众号推送的消息,推送后观察者会收到更新。可以抽象出一个观察者接口:
1 2 3 4 5 6 public interface Observer { void update (String obj) ; }
2.观察者实现 用户实现观察者接口,收到消息后将消息打印:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class UserObserver implements Observer { private String name; private String message; public UserObserver (String name) { this .name = name; } @Override public void update (String message) { this .message = message; readMessage(); } private void readMessage () { System.out.println(name + "收到一条消息:" + message); } }
3.被观察者抽象层 被观察者提供订阅、取消订阅、发布消息、以及发布消息后通知观察者的功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 public interface Observable { void addObserver (Observer observer) ; void removeObserver (Observer observer) ; void notifyObservers () ; void pushMessage (String message) ; }
4.被观察者实现 定义一个公众号的被观察者,并实现Observable:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public class WechatObservable implements Observable { private final List<Observer> list = new ArrayList<>(); private String message; @Override public void addObserver (Observer observer) { list.add(observer); } @Override public void removeObserver (Observer observer) { list.remove(observer); } @Override public void notifyObservers () { for (Observer observer : list) { observer.update(message); } } @Override public void pushMessage (String message) { this .message = message; notifyObservers(); } }
5.测试代码 1 2 3 4 5 6 7 8 9 10 11 12 13 public class ObserverTest { public static void main (String[] args) { WechatObservable wechatObservable = new WechatObservable(); UserObserver ryan = new UserObserver("Ryan" ); UserObserver frank = new UserObserver("Mike" ); wechatObservable.addObserver(ryan); wechatObservable.addObserver(frank); wechatObservable.pushMessage("this is a news" ); } }
打印结果:
1 2 Ryan收到一条消息:this is a news Mike收到一条消息:this is a news
二、策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。策略模式设计三个角色,环境(Context)角色、抽象策略(Strategy)角色以及具体策略(ConcreteStrategy)角色。 来看一个现实生活的例子,假设一个商场有三种会员(Strategy),分别为普通会员(StandardMemberStraegy)、白银会员(SilverMemberStrategy)以及黄金会员(GoldenMemberStrategy)。针对三种会员分别制定了不同的优方案。普通会员打九折、白银会员打八折、黄金会员打七折。来看如何用策略模式实现上述场景。
1.创建抽象策略类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public abstract class Strategy { private String strategy; public String getStrategy () { return strategy; } public Strategy (String strategy) { super(); this .strategy = strategy; } abstract double getPrice (double normalPrice) ; }
2.创建环境类(Context)并持有抽象策略类 1 2 3 4 5 6 7 8 9 10 11 12 public class Context { private Strategy mStrategy; public void setStrategy(Strategy strategy ) { mStrategy=strategy; } public double executePrice(double normalPrice ) { System . out.println(mStrategy.getStrategy() +"Member,折后价:" +mStrategy.getPrice(normalPrice ) ); return mStrategy.getPrice(normalPrice ) ; } }
3.创建三种会员策略类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class StandardMemberStraegy extends Strategy { public StandardMemberStraegy (String strategy) { super (strategy); } @Override public double getPrice(double normalPrice) { return 0.9 *normalPrice; } } public class SilverMemberStrategy extends Strategy { public SilverMemberStrategy (String strategy) { super (strategy); } @Override public double getPrice(double normalPrice) { return 0.8 *normalPrice; } } public class GoldenMemberStrategy extends Strategy { public GoldenMemberStrategy (String strategy) { super (strategy); } @Override public double getPrice(double normalPrice) { return 0.7 *normalPrice; } }
4.创建策略模式测试类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class StrategyTest { public static void main(String[] args) { StandardMemberStraegy standar=new StandardMemberStraegy("Standar" ) ; SilverMemberStrategy silver=new SilverMemberStrategy("Silver" ) ; GoldenMemberStrategy golden=new GoldenMemberStrategy("Golden" ) ; Context context=new Context() ; context.setStrategy(standar ) ; context.executePrice(100) ; context.setStrategy(silver ) ; context.executePrice(100) ; context.setStrategy(golden ) ; context.executePrice(100) ; } }
运行结果:
StandarMember,折后价:90.0 SilverMember,折后价:80.0 GoldenMember,折后价:70.0