策略模式(Strategy Pattern)

  • 先从一个例子说起…
	首先有一个系统内部设计使用了标准的OO技术,设计了一个鸭子超类(superclass)。并让各种鸭子继承此超类。

这里写图片描述

	产品经理提出了新的需求,引入了会飞的鸭子....,对于一个OO程序员来说,这有什么困难的了,只要在鸭子超类
	(Duck)中加入fly()方法就可以了。可是这样的话,所有的鸭子就都会飞了...,可以在不需要飞行的鸭子子类中
	重写fly()方法...,这样也是可以的,只是如果不会飞的鸭子子类有50多个,这样就需要在50多个类中重写
	fly()方法了,这样的设计显然不是合理的。
	对于这样的问题,可以将fly()方法从鸭子超类中抽取出来,单独写一个接口Flyable.

这里写图片描述

	在这里,只考虑两种情况,会飞和不会飞,写两个子类继承Flyable接口,实现fly()方法。

这里写图片描述

	以前的做法是:行为来自Duck类的具体实现,这种做法太依赖于"实现",我们被实现绑的死死的,没办法更改行为。
	在新的设计中,将使用鸭子的子类所表示的行为,这样就不会被"实现"绑死。
	来看下重新设计的Duck类

这里写图片描述

	// 让Duck持有Flyable接口,加入performFly()和setFlyable(Flyable fly)方法
	performFly(){
		flyAble.fly();//调用接口中的fly()方法
	}
	
	setFlyable(Flyable fly){
		this.flyAble = fly;//这样就可以动态的设置Flyable类的具体实现子类了,对于父类来说这是透明的
	}
	再看下现在的鸭子子类的实现 

这里写图片描述

	// 这样将行为委托给flyAble来处理,同时加入的setFlyable(Flyable fly)方法可以动态改变行为
	GreenDuck duck = new GreenDuck();
	duck.performFly();//飞行
	duck.setFlyable(new FlyNoWay());
	duck.performFly();//不会飞行

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值