个人理解--策略模式

策略模式

下面的所有知识点来自《Head First 设计模式》,相关理论经过本人理解转义,请知悉

如需要原始理论,请自行百度相关书籍

什么是策略模式

策略模式就是将一个类中不变的部分和变化的部分分离成两个类

让我们用一个 鸭子项目来深入理解这种模式

Duck.class是鸭子的超类

//请注意这个类是一个抽象类
public abstract class Duck{
    //鸭子都会呱呱叫
  	void  quack(){
        .......
    }
    //鸭子都能游泳
    void swim(){
        .......
    }
    //鸭子都有自己的外观
   abstract void display();
}

如果现在有两个不同外观的鸭子 MallardDuckRedheadDuck,继承 Duck类,实现display()方法

class MallardDuck extend Duck{
	void display(){
	//外观是绿头
	......
	}
}

class RedheadDuck extend Duck{
	void display(){
	//外观是红头
	......
	}
}

目前如果需要添加鸭子,继承Duck类即可

公司现在要让鸭子飞起来

这时候,如果你在Duck中直接实现fly()方法,你认为功能很完善,收拾东西回家过年了

//请注意这个类是一个抽象类
public abstract class Duck{
    //鸭子都会呱呱叫
  	void  quack(){
        .......
    }
    //鸭子都能游泳
    void swim(){
        .......
    }
    //让鸭子都飞起来
    void fly(){
        ....
    }
    //鸭子都有自己的外观
   abstract void display();
}

同时,你大意的同事,在系统中加入了新的不会叫橡皮鸭子(RubberDuck),却也和你一样着急回家过年

class RubberDuck extend Duck{
	void display(){
	//外观是黄色
	......
	}
}

这样,年后系统中多了一只能飞的橡皮鸭子,而你和你大意的同事,大概要开始刷力扣了

为了解决这个问题,你把Duck中fly()方法改为了抽象方法,这时,公司买了一只木头鸭子,你举一反三地把quack()也改成了抽象方法。

到目前为止,你解决你当前遇到的所有问题,可是你的上司是一个喜欢定期更新一大批鸭子品类的变态。

每加入一个品类的鸭子,你就需要维护相应的quack()、fly()、display()方法

为了实现你主管龌龊的计划,你必须想出其他的方法,来解决这个问题

策略模式帮助你解决了这个问题

把鸭子类中变化的部分(quack、fly )抽离出来作为单独的超类(quackimpl,flyimpl),使用子类实现quackimpl接口的方法,如下图所示

未命名绘图

同时:在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;
	}

	abstract void display();

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

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

	public void swim() {
		System.out.println("All ducks float, even decoys!");
	}
}
public interface FlyBehavior {
	public void fly();
}
public interface QuackBehavior {
	public void quack();
}
public class MallardDuck extends Duck {

	public MallardDuck() {
		//QUACK() 是quack的行为类
		quackBehavior = new Quack();
        //FlyWithWings 是fly的行为类
		flyBehavior = new FlyWithWings();

	}

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

head of first 设计模式相关源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值