策略模式

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

思考一个场景:

有一个鸭子的接口,鸭子可以叫 飞   将鸭子定义为一个接口,叫 和 飞成为其中的两个方法。后续出来了  具体的实现类:

红鸭子  白鸭子 他们除了外观不同  叫 和 飞是相同的。

橡皮鸭子:会叫  但是不会飞  而且叫声与 红鸭子  白鸭子 不同。

丑小鸭:会叫  2岁之前不会飞  2岁之后可以飞

....... 这样的鸭子有许多许多   叫声和飞的行为各有不同

如果把鸭子作为接口,其他的具体事物都作为实现类的话  这样 红鸭子  白鸭子 .... 就会出现同样的代码。

下面介绍一种策略模式的东西来解决这个问题。

策略模式的关键:

找出应用中可能出现的变化之处,将他们独立出来不要和那些不需要变化的代码混在一起

多用组合 ,少用继承

针对接口编程,不对实现进行编程。

 

实例:

将鸭子的叫声 和 飞行 动作 独立出来:

将变化的部分与使用的客户独立出来,自己变化自己的,中间通过接口来调用

 

将叫声独立出一个接口

package com.wc.study.strategy;

public interface CallBehaviour {
	void call();
}

叫声的一个实现类 :

package com.wc.study.strategy;

public class CallBygg implements CallBehaviour{
	@Override
	public void call() {
		System.out.println("i call guagua ");
	}
}

另一个实现叫声的类:

package com.wc.study.strategy;

public class CallByzz implements CallBehaviour{

	@Override
	public void call() {
		System.out.println(" i call zhizhi~");
	}

}

 

将飞的行为独立出来:

package com.wc.study.strategy;

public interface FlyBehaviour {
	void fly();
}

第一种飞的情况:

package com.wc.study.strategy;

public class FlyNoWay implements FlyBehaviour{

	@Override
	public void fly() {
		System.out.println(" i cannot fly");
	}

}

第二种飞的情况:

package com.wc.study.strategy;

public class FlyWithWing implements FlyBehaviour{

	@Override
	public void fly() {
		System.out.println("i can fly with wing");
	}

}

 

鸭子:(鸭子有飞的行为 和 叫的行为  只是外观不同)使用组合的方式将鸭子组合起来。

package com.wc.study.strategy;

public abstract class Duck {
	CallBehaviour callBehaviour;
	FlyBehaviour flyBehaviour;
	
	public abstract void display();
	
	public void call(){
		callBehaviour.call();
	}
	
	public void fly(){
		flyBehaviour.fly();
	}
}

一只橡皮鸭: 

package com.wc.study.strategy;
/**
 * 橡皮鸭
 * @author wangchen
 *
 */
public class RubberDuck extends Duck{
	
	public RubberDuck() {
		super.callBehaviour = new CallByzz();
		super.flyBehaviour = new FlyNoWay();
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("i am rubber duck");
	}
}
package com.wc.study.strategy;

public class DemoTest {
	public static void main(String[] args) {
		Duck duck = new RubberDuck();
		duck.display();
		duck.call();
		duck.fly();
		
//		i am rubber duck
//		i call zhizhi~
//		i cannot fly
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值