设计模式之策略模式-笔记

来源:互联网 发布:演技 知乎 编辑:程序博客网 时间:2024/06/09 17:56
策略模式: 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,不同的子类可以调用不同的算法实现


设计原则:1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
 2、针对接口编程,而不针对实现编程,即利用接口代表每一个行为,而行为的每一个实现都将实现其中的一个接口,鸭子子类不需要负责实现Flying和Quacking接口,而是由专门的行为类进行实现,这样,鸭子类就不再需要知道行为的实现细节
 3、多用组合,少用继承;使用组合建立的系统具有很大的弹性,不仅可以将算法族封装成类,更可以在运行时动态的改变行为,只要组合的行为对象符合正确的接口标准即可


场景:设计一个鸭子类,有些鸭子可以叫、可以飞,有些鸭子只是模型,叫声不一样,但不能飞,有些木鸭子既不能叫也不能飞
定义鸭子基类,将飞和叫的动作独立起来,可以定义接口,每个接口代表一个行为,如FlyBehavior 和QuackBehavior 两个接口分别代表行为飞和叫

//鸭子的基类
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 interface FlyBehavior{
public void fly();
}
//飞行行为
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I'm flying!!");
}
}
//不会飞
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can't fly!!");
}
}
//叫行为的接口
public interface QuackBehavior{
public void quack();
}
//真实鸭子的叫
public class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}
//模型鸭子的叫
public class Squeak implements QuackBehavior{
public void quack(){
System.out.println("Squeak");
}
}
//真实鸭子的叫
public class MuteQuack implements QuackBehavior{
public void quack(){
System.out.println("Silence");
}
}

//真实鸭子子类
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!!");
}
}
//模型鸭子子类
public class ModelDuck extends Duck{
public ModelDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
public void display(){
System.out.println("I'm a model duck!!")
}
}

public class TestDuck{
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.display()

Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.display();
}
}
//运行结果为:
I'm flying!!
Quack
I'm a real Mallard duck!!
I can't fly!!
Squeak
I'm a model duck!!


//可以在Duck类中加入动态设定的方法
public abstract class Duck{
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public Duck(){}

public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}

public abstract void display();

public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
}
这样可以根据传入的飞行对象进行动态变化
如 定义一个 火箭飞行类

public class FlyRocketPowered implements FlyBehavior{
public void fly(){
System.out.println("I'm flying with a rocket!!");
}
}
//
public class TestDuck{
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.display()

Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.display();

model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
//运行结果为:
I'm flying!!
Quack
I'm a real Mallard duck!!
I can't fly!!
Squeak
I'm a model duck!!
I'm flying with a rocket!!

模型鸭子就可以动态改变自己的飞行行为或者叫声行为
原创粉丝点击