浅析Java设计模式(三)

本篇文章继续来学习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


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!