Java 23种设计模式之策略模式

Java 23种设计模式之策略模式

一堆废话,请无视:
做了几年程序员,感觉自己欠缺的很多,而且年近30来自于各方面的压力都促使我迫切的提高自己。
1.考驾照中
2.每天英语打卡
3.每天看点书(在这里做笔记)
4.骑自行车上下班(锻炼身体,很多前辈都是前车之鉴)

策略模式

1.一个模拟鸭子的简单应用
Joe做了一个模拟鸭子的游戏:SimUDuck.游戏中会出现各种鸭子,一边游泳,一边呱呱叫。

Alt
2.让鸭子飞起来
主管要求,让鸭子飞起来,Joe在Duck中增加了fly()方法。
那么问题来了,现在橡皮鸭RubberDuck中也飞来飞去,并且是会吱吱叫,不会呱呱叫
在这里插入图片描述
Joe想通过继承,复写fly()和quack()方法,但是随着产品的增加,需要覆盖所有的fly()和quack()方法。。。。。。简直是无穷无尽的噩梦。
使用接口怎么样,把“飞“和“叫”分别放进两个接口“Flyable”,“Quackable”,
但是使用接口可以解决重复的问题,缺点是造成了代码无法复用

在这里插入图片描述
第一个设计原则
在这里插入图片描述
3.分开变化和不会变化的部分
fly()和quack()方法会随着鸭子的变化而变化,因此将2个方法提取出来,建立一组新类代表两个行为:FlyBehavior,QucakBehavior.
第二个设计原则
在这里插入图片描述
通过接口可以动态的改变鸭子的行为,而且,fly和quack的具体实现不会绑死在鸭子类中
鸭子的行为:
在这里插入图片描述

这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。
而我们可以新增一些行为,不会影响到既有的行为类,也不会影响到“使用”到飞行行为的鸭子类。

4.整合鸭子的行为
1)在Duck类中增加两个实例变量
2)实现performQuack()
3) 实现perofrmFly()
代码如下:

public abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
 
	public Duck() {
	}
 
	abstract void display();

	public void performFly() {
		flyBehavior.fly();
	}

	public void performQuack() {
		quackBehavior.quack();
	}

	public void swim() {
		System.out.println("All ducks float, even decoys!");
	}
}

4)在MallarDuck类中的应用
在这里插入图片描述
FlyBehavior接口和其实现类
在这里插入图片描述
4.动态设定鸭子的行为
建立了一堆动态功能而没有使用,可以在鸭子子类中通过“setter”方法,来设定鸭子的行为,而不是在构造器内实例化
在Duck类中增加两个新方法

public void setFlyBehavior (FlyBehavior fb) {
		flyBehavior = fb;
	}

	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}

5.封装行为的大局观
不再把鸭子的行为说成“一组行为”,而是“一族算法”
重新设计后的类结构:
在这里插入图片描述
第三个设计原则
在这里插入图片描述
6.总结
策略设计模式定义了算法族,分别封装起来,让他们之前可以相互替换,此模式让算法的变化独立于使用算法的客户。
PS:在java中,ArrayList的sort(Comparator<? super E> c)应用的就是策略模式,根据传入的比较器,决定排序的方式
以上,HeadFirst第一篇读书笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值