1. 策略模式(Strategy pattern)

Referenced by Head First Design Pattern

设计模式,主要是为了让代码更具弹性。

原始的模拟鸭子游戏:

使用标准的OO技术,设计一个鸭子超类,并让各种鸭子继承此超类:



现在需要添加一个fly()的功能,最简单的做法是在超类中添加fly()方法,但是并不是所有的子类都需要这个方法。

因此这种设计有几个缺陷:

1.  增加一个新的鸭子(比如橡皮鸭子),需要检查已知的每个功能是否需要拥有。

2.  增加一个新的功能,需要检查每种鸭子是否需要拥有这个功能,即牵一发而动全身。

3.  最大的问题,同一个功能对不同的鸭子可能有多种变化,比如每种鸭子飞行的方式不同,叫的声音也不同。

4.  运行时的行为不容易改变。而且容易造成代码复用。

设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

鸭子的子类使用接口所表示的行为,所以实现的"实际"不会被绑定死在鸭子的子类中。(换句话说,特定的具体行为编写在实现了FlyBehavior与QuackBehavior的类中)


Duck超类的实现方式:

public abstract class Duck {
	FlyBehavior flyBehavior;//飞行行为的对象
	QuackBehavior quackBehavior;
	public Duck() {
	}
	public abstract void display();
	public void swim() {
		System.out.println("All ducks float, even decoys!");
	}
	
	public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;//动态改变飞行行为
	}
	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}
	public void performFly() {
		flyBehavior.fly();//委托给行为类处理
	}

实现飞行行为的接口:

public interface FlyBehavior {
	public void fly();
}

具体实现飞行方式的行为类:

public class FlyWithWings implements FlyBehavior{
	public void fly() {
		System.out.println("I'm flying");
	}
}

具体某种Duck的类:

public class MallardDuck extends Duck{
	public MallardDuck() {
		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	public void display() {
		System.out.println("I'm a real Mallard duck");
	}

这样,就可以使用:

Duck mallard = new MallardDuck();
mallard.setFlyBehavior(new FlyNoWay());

来创建真正的对象了。并可以动态改变行为。


设计原则:多用组合,少用继承。

策略模式(Strategy Pattern):定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

共享模式词汇的威力:

1.共享的模式词汇"威力强大"

2.模式能够让你用更少的词汇做更充分的沟通

3.将说话的方式保持在模式层次,可让你待在“设计圈子”久一点

4.共享词汇可帮你的开发团队快速充电

5.共享词汇能帮助初级开发人员迅速成长



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值