属于对象行为模型,用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使他们互相替换;将算法的责任和算法本身分隔开,委派给不同的对象管理,把算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说就是:准备一组算法,并将每一个算法封装起来,使他们可以互换。类图如下:
这个模式设计到三个角色:
环境(context):持有一个strategy类的引用
抽象策略(strategy):这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出了所有的具体的策略类所需要的接口。
具体策略(concrete strategy):包装了相关的算法和行为
public class Context
{
private Strategy strategy;
public void contextInterface()
{
strategy.strategyInterface();
}
}
abstract public class Strategy
{
public abstract void strategyInterface();
}
public class ConcreteStrategy extends Strategy
{
public void strategyInterface()
{
//write different algorithm
}
}
策略模式并不负责决定何时使用何种具体策略角色,仅仅封装算法,提供新算法插入到已有的系统中,以及老算法从系统中“退休”的方便;策略模式实现了高内聚低耦合。
代理模式(proxy)
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。
代理模式的结构
- 抽象主题角色:声明了代理主题和真实主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题
- 代理主题角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实的主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实的主体,控制对真实主题的引用,负责在需要的时候创建真实主题对象,代理角色通常在将客户端调用传递给真实的主题之前或者之后都要执行这个操作
- 真实主题角色:定义了代理角色所代表的真实对象