学习head first 设计模式之策略模式

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

简单的模拟鸭子应用做起: 超类DUCK存在鸭子的行为


随着业务需求的增加 可能会增加让鸭子飞的行为,我们可以直接在超类增加抽象方法fly(); 然后实现类去实现这个方法 这样就可以飞了,但是这样会造成后面的隐患,比如增加需求有个橡胶鸭子的实现类是不需要飞的操作的,后面再有其他的实现类的增加 ,造成代码在多个子类中重复,改变会造成其他鸭子不想要的改变,运行时的行为不容易改变。

这样就根据前人总结的经验设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混淆在一起。

为了让代码有弹性,让鸭子的行为动态的改变,在运行时动态的改变鸭子的飞行行为。

这样通过第二个设计原则:针对接口编程,而不是针对实现编程

以前的做法是:行为来之duck超类的具体实现,或是继承某个接口并由子类自行实现。这两种做法都是依赖于“实现”,要想改变行为需要写更多的代码 不利于后期的代码维护。

在策略模式中:鸭子的子类将使用接口(flybehavior与quackbehavior)所表示的行为,所以实际的实现编写在flybehavior与quackbehavior的类中。


duck超类代码:


package headfirst.designpatterns.strategy;

public abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	public Duck() {
	}

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

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

	abstract void display();

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

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

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

quackbehacior接口:

package headfirst.designpatterns.strategy;

public interface QuackBehavior {
	public void quack();
}

flybehavior接口:

package headfirst.designpatterns.strategy;

public interface FlyBehavior {
	public void fly();
}
鸭子DecoyDuck实现类:

package headfirst.designpatterns.strategy;

public class DecoyDuck extends Duck {
	public DecoyDuck() {
		setFlyBehavior(new FlyNoWay());
		setQuackBehavior(new MuteQuack());
	}
	public void display() {
		System.out.println("I'm a duck Decoy");
	}
}

鸭子modelduck实现类:

package headfirst.designpatterns.strategy;

public class ModelDuck extends Duck {
	public ModelDuck() {
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}

	public void display() {
		System.out.println("I'm a model duck");
	}
}

测试类:

package headfirst.designpatterns.strategy;

public class MiniDuckSimulator {
    
    public static void main(String[] args) {
        
        DecoyDuck decoy = new DecoyDuck();
        
        Duck model = new ModelDuck();
        
        decoy.performQuack();
        
        model.performFly();	
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}

以上代码均来自head first网站 建议看从head first书籍学习 讲的很生动

个人对此模式理解为 将组合代替继承 使代码更有弹性


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值