策略模式:分别封装行为接口,实现算法族,超类里放行为的接口对象,在子类里具体设定行为对象.
原则就是:分离变化部分,封装接口,基于接口编程各种功能.
为什么要用策略模式
{
继承带来的问题: (为策略模式)
对类的局部改动,尤其是超类的改动,会影响其它部分,影响会有溢出效应.
溢出效应:
在超类中添加了一个功能(方法),子类直接继承得到了这个方法.
超类里面挖的一个坑,每一个子类都要来填,增加工作量,复杂度是N的平方,
}
什么情况下用策略模式?
我的理解:在有很多种形为或功能的情况下.而其每一种形为或功能在不同时候表现不一样.也就是说当听到什么什么同进,表现也就不一样了.
比如说:鱼可以游,但是有的鱼是慢慢游,有的鱼游得一般,有的鱼游得很快.所以就可以定义一个接口ISwim,然后就在用SlowSwim,GeneralSwim,QuickSwim三个类分别去实现这个ISwim接口.SlowSwim,GeneralSwim,QuickSwim这三个类就叫行为族.
怎样用这个策略模式?
还是按照上面的鱼来说,定义一个抽象的Fish类,Fish里面有一个ISwim字段,通过构造方法传入.
现在有假设有一条鲸鱼是快游
public class Whale extends Fish{ { private ISwim swim; whale(ISwim swim){ this.swim=swim; } public void swim (){ swim.swim(); } public void static main(String[] arg){ //鲸鱼是很游得很快的所以传入ISwim的子类QuictSwim Whale whale= new Whale(new QuictSwim());
whale.swim(); } }
策略模式的优点?
1,当我们要添加一个行为(方法)的时候可以不用去改源码,直接添加一个类就可以了.
2,我们把所有行为族定义好之后,就要以自己的进行行为之间组合.
策略模式的缺点?
1,客户端必须知道所有的策略类也就是行为族,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2,行为族很多类很多.
时间: 2024-09-28 18:16:17