设计模式之策略模式

一、 设计模式

软件设计中总结出来的针对于某类问题的通用解决方案;

二、策略模式
1、需求:鸭子都有发出叫声和会游泳的特性,不同的鸭子有不同的显示
设计实现:
父类:Duck
子类:RedHeadDuck、GreenHeadDuck

共有的特性在父类中实现;
	public void swim(){//添加实现}
	public void quack(){//添加实现}
	public abstract void display();//在父类中定义
独有的特性子类中实现;
	public abstract void display();//在子类中针对各自特征实现

2、新需求:添加会飞的鸭子

2.1 解决办法:在超类中添加会飞的特性 public void fly(){//具体实现}
	存在问题:有的鸭子没有飞的特性
	分析原因:父类的修改会影响子类的修改
2.2 解决办法1:在不会飞的鸭子类中添加不会飞特性覆盖父类的方法;
	问题:如果大量的鸭子类别,意味着父类的修改会影响很多子类的修改,存在大量重复的工作;
	解决办法2:父类抽象,由子类实现(代码复用性低)
2.3 解决办法:使用策略模式实现

3、策略模式的实现
需要新的设计方式,应对项目的扩展性,降低复杂度:
1)分析项目变化与不变的部分,提取变化部分,抽象成接口+实现;
2)鸭子的哪些功能时根据需求变化的?叫声,飞行

针对特性定义接口类:
	public interface FlyBehavior(){
		void fly();
	}
	//在HightFly、LowFly类中分别实现;
	public interface QuackBehavior(){
		void quack();
	}
	//在PleasantQuack、ScrannelQuack类中分别实现;
行为的初始化:
	在Duck类中声明;
		FlyBehavior flyBehavior;
	   QuackBehavior quackBehavior;
	在子类中创建对象赋予其特定的特性:
		public GreenHeadDuck() {
		flyBehavior = new LowFly();
		quackBehavior = new ScrannelQuack();
	}

设计优点:新增行为简单,更好的功能复用
4、类的详细设计

com.strategy.domain
	Duck
	RedHeadDuck
	GreenHeadDuck
	StoneDuck
com.strategy.fly.behavior
	FlyBehavior
	LowFly
	HightFly
com.strategy.quack.behavior
	QuackBehavior
	PleasantQuack
	ScrannelQuack
com.strategy.run
	DuckTest

5、策略模式的思想

封装变化动作为接口,定义行为族,超类中只是存放行为接口对象,子类中创建的时
候设定行为对象(生成对应特性的对象,从而得到该特性对象的实现);
**实现细节:**
1)分离变化部分,封装接口,基于接口编程;
2)使用面向对象编程,多用组合少用继承(降低算法的复杂度及耦合度)

6、代码的实现:
https://github.com/vagrant-angel/design-pattern/tree/pattern/strategy-pattern

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值