关闭

设计模式入门--策略设计模式

标签: 策略设计模式
128人阅读 评论(0) 收藏 举报
分类:

设计原则1 

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起。(变化的部分封装起来)

设计原则2

针对接口编程,而不是针对实现编程。

设计原则3

多用组合,少用继承


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

=================================

接口

//QuackBehavior接口

public interface QuackBehavior {
	public void quack();
}

//FlyBehavior接口

public interface FlyBehavior {
	public void fly();
}
接口实现类
public class FlyWithWings implements FlyBehavior {

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

}
public class Quack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("<< Quack >>");
	}

}
父类

public abstract class Duck {
	// 1. 加入了两个实例变量
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	// 2. 实现相应的行为
	public void performQuack() {
		quackBehavior.quack();
	}

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

	public void swim() {
		System.out.println("All ducks can swim");
	}

	public abstract void display();

}

子类

public class MallarDuck extends Duck {

	/**
	 * 设计模式中讲到,针对接口编程,而不是针对实现编程。 此处的构造函数中却制造了一个具体实现类的实例
	 * 
	 * 在此处暂时先这么做,后面的有更多设计模式时候修正这一点
	 */
	public MallarDuck() {
		// 子类继承了Duck类,所以具有quackBehavior实例变量
		quackBehavior = new Quack(); // 制造了一个具体实例
		flyBehavior = new FlyWithWings();
	}

	public void display() {
		System.out.println("I am a Mallard duck");
	}
}
测试类

public class DuckTest {
	public static void main(String[] args) {

		Duck duck = new MallarDuck(); // 多态性
		duck.performFly();
		duck.performQuack();
		duck.display();
		duck.swim();
	}
	//结果
	/**
	 * I am flying
	 * << Quack >>
	 * I am a Mallard duck
	 * All ducks can swim
	 */
}

动态的设定行为

// 在Duck类中加入两个新方法
	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}

	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
制造一个新的Duck类型

public class ModelDuck extends Duck {

	public ModelDuck() {
		flyBehavior = new FlyNoWay(); // 此处没有会飞的行为
		quackBehavior = new Quack();
	}

	@Override
	public void display() {
		System.out.println("I am a model Duck");
	}

}
建立一个新的Fly行为

public class FlyRocketPowered implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("I am flying with a rocket");
	}

}
改变行为

private static void modelDuckTest() {
		Duck model = new ModelDuck();
		model.performFly(); // I cann't fly
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly(); // I am flying with a rocket
	}






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27146次
    • 积分:1064
    • 等级:
    • 排名:千里之外
    • 原创:81篇
    • 转载:3篇
    • 译文:1篇
    • 评论:2条
    文章分类
    最新评论