策略模式学习笔记

策略模式

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

设计思想:将变化的部分封装成接口及其具体实现类,例如将飞行行为和呱呱叫行为封装起来,这样的设计,使得它们可以被其他的对象复用,因为这些行为已经与鸭子类无关了,我们也可以新增一些行为,不会影响到既有的行为类,也不会影响“使用”到飞行行为的鸭子类;从Duck类的角度来看,把不变的部分留下来,把变化的部分(飞行行为和呱呱叫行为)委托出去,而不是使用定义在Duck类或子类内的飞行方法和呱呱叫方法。


/**
 * 封装飞行行为
 * 
 */
public interface FlyBehavior {

	public void fly();
}
public class FlyWithWings implements FlyBehavior{

	public void fly() {
		System.out.println("I am flying!");
	}

}
public class FlyNoWay implements FlyBehavior{

	public void fly() {
		System.out.println("I cannot fly!");
	}

}
/**
 * 封装呱呱叫行为
 *
 */
public interface QuackBehavior {

	public void quack();
}
public class Quack implements QuackBehavior{

	public void quack() {
		System.out.println("Quack");
	}

}
public class MuteQuack implements QuackBehavior{

	public void quack() {
		System.out.println("silent");
	}

}
public class Squeak implements QuackBehavior{

	public void quack(){
		System.out.println("Squeak");
	}
}
/**
 * 抽象鸭子类
 *
 */
public abstract class Duck {

	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck(){

	}
	
	public abstract void display();
	
	/*将飞行行为委托给接口处理*/
	public void performFly(){
		flyBehavior.fly();
	}
	
	/*将呱呱叫行为委托给接口处理*/
	public void performQuack(){
		quackBehavior.quack();
	}
	
	/*可以动态改变飞行行为*/
	public void setFlyBehavior(FlyBehavior fb){
		flyBehavior = fb;
	}
	
	/*可以动态改变呱呱叫行为*/
	public void setQuackBehavior(QuackBehavior qb){
		quackBehavior = qb;
	}
	
	public void swim(){
		System.out.println("all ducks float, even decoys!");
	}
}
/**
 * 子类MallrdDuck
 *
 */
public class MallardDuck extends Duck{
	
	public MallardDuck(){
		quackBehavior = new Quack();//获得具体实现类
		flyBehavior = new FlyWithWings();//获得具体实现类
	}

	public void display() {
		System.out.println("i am a Mallard Duck!");
	}
}
/**
 * MainClass
 *
 */
public class MainClass {

	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		
		mallard.performQuack();
		mallard.performFly();
		
		/*运行时动态改变其行为*/
		mallard.setFlyBehavior(new FlyNoWay());
		mallard.setQuackBehavior(new Squeak());
		
		mallard.performQuack();
		mallard.performFly();
	}

}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值