Java之设计模式

生成器模式

用法:当要创建一个具有复杂功能的对象时,我们可以使用一个简单对象来创建。它从小而简单的对象逐步创建更大更复杂的对象。生成器模式是另一个创建模式。

举例:当创建一个窗口作为我们应用程序的主窗口时,我们需要创建一个菜单,一个工具栏,然后添加菜单和工具栏。对于我们要创建的每个窗口,我们需要创建一个空窗口,创建菜单,创建工具栏,将菜单和工具栏安装到窗口。我们可以使用构建器模式来隐藏如何创建窗口的实现。

代码举例:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//Pizza属性类
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";

public void setDough (String dough) { this.dough = dough; }
public void setSauce (String sauce) { this.sauce = sauce; }
public void setTopping (String topping) { this.topping = topping; }
}

//pizza生成器抽象类,相当于Pizza制作标准
abstract class PizzaBuilder {
protected Pizza pizza;
//创建Pizza对象
public void createNewPizzaProduct() { pizza = new Pizza(); }
//将制作Pizza的方法抽象出来
public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
//返回此Pizza,关键用法
public Pizza getPizza() { return pizza; }
}

//具体的pizza生成器类,相当于Pizza制作具体到具体厂家
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("cross"); }
public void buildSauce() { pizza.setSauce("mild"); }
public void buildTopping() { pizza.setTopping("ham+pineapple"); }
}

class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("pan baked"); }
public void buildSauce() { pizza.setSauce("hot"); }
public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
}

//创建pizza,万恶的指挥者,构造传入具体厂家对象,利用厂家对象制作Pizza,并将Pizza放回供后面测试调用
class Waiter {
private PizzaBuilder pizzaBuilder;
//这两步可以用构造函数传入PizzaBuilder对象代替
public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza getPizza() { return pizzaBuilder.getPizza(); }
//提供一个方法将厂家的Pizza制作方法集合起来
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
}

//创建实例,Test
class BuilderExample {
public static void main(String[] args) {

Waiter waiter = new Waiter();

//构建Pizza制作厂家
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();

waiter.setPizzaBuilder ( hawaiian_pizzabuilder );
waiter.constructPizza(); //指挥者让厂家制作Pizza

//为了构建一个复杂的Pizza对象,我们只需要利用Waiter这个简单对象即可
Pizza pizza = waiter.getPizza();
}
}

观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅模式。在观察者模式中,发布者我们称之为被观察者,订阅者称之为观察者。

关于观察者模式有两种应用:

自定义

主要实现思路是,观察者和被观察者都定义成接口形式,

被观察者接口提供增删观察者的方法通知方法,在实现类中添加数据设置方法

观察者接口提供数据更新方法

观察者实现类注入被观察者接口,并绑定与该观察者的关系(被观察者添加该观察者)

在测试时,构造一个被观察者以及多个观察者对象,被观察者尝试设置数据,看观察者是否接收到信息。>

使用Java内置API

Java中,继承Observable的类称为可被观察者,实现Observer接口的类称为观察者。

有了以上的内置API,我们不再需要自己写两种接口了。

这里,需要注意的是,观察者需要实现接口的update(Observable o, Object arg)方法,其中第一个参数就是被观察者对象,而它依然是通过构造注入观察者类的。在该方法中,你可以读取到被观察者的数据,从而被观察者实现了”通知”。

以上两种方式具体代码实现可见:<https://blog.csdn.net/zhongxuebin_xq/article/details/81429625

不要投钱给我
0%