桥接模式
“将’抽象‘与‘实现’分离,使两者可以独立地变化。”
“想要实现一个‘抽象’类的一个功能,除了通过继承实现,还可以通过声明一个桥接成员,通过调用该成员的实现的功能来实现自己的功能。即桥接别人的功能。”
“描述了两个类群组之间交叉组合汇编,存在一个整体有两个连接的灵活可变部分的状态。”
成员:
Abstraction(抽象体接口)、Implementor(实现体接口)、具体Abstraction(抽象体)、具体Implementor(实现体)
使用方法概述:
Abstraction抽象体接口拥有Implementor实现体接口的引用。由抽象体子类决定实现体的子类,并决定在方法中如何调用实现体的方法。外部使用时就只是确定抽象体子类并调用相关方法。
示例:
public abstract class Abstraction{
//实现体
Implementor impl;
//调用实现体方法
public void Operation(){
impl.OperationImpl();
}
}
public abstract class Implementor{
//可被调用的实现体方法
public void OperationImpl(){
}
}
应用场景和优点:
单一职责、开闭、依赖倒置:分离了’抽象‘与‘实现’
1、降低维护难度,方便修改和增加抽象体能用的实现方法。
2、实现了两个类群组低耦合的连接合作,彼此扩展不影响对方。
缺点:
无
应用:角色和载具,法术
策略模式
“定义一组算法,并封装每个算法,让它们彼此可以交换使用,客户端可以独立地使用它们。”
“设置算法类群组,将多变的方法分离出来专门封装成一个类由客户端调用”
成员:
Context(策略客户端)、Strategy(策略接口类)、具体Strategy(提供“策略客户端”可以使用的方法)
使用方法概述:
Context策略客户端拥有Strategy策略接口类的引用。在不同的情况下,设置不同的具体Strategy类,来调用它的方法。
示例:
public abstract class Context{
//策略接口
Strategy m_strategy;
public void SetStrategy(Strategy strategy){
m_strategy = strategy;
}
//调用策略类的算法
public void Operation(){
m_strategy.Algorithm();
}
}
应用场景和优点:
单一职责、开闭、依赖倒置:细分粒度,分离了方法的实现
1、降低维护难度,方便修改和增加能用的实现方法。
2、使原来的类不再依赖具体的算法,而能够改变算法。
缺点:
无
应用:角色属性计算,登陆策略
模板方法模式
“在一个方法中定义算法流程,其中某些步骤由子类实现。从而让子类在不改变原有算法流程的情况下,还能重新定义其中的步骤。”
“将可能重复的流程抽象出来,提升到父类中作为模板方法,由子类决定步骤的实现。”
成员:
抽象Class(算法定义类)、具体Class(算法步骤的实现类)
使用方法概述:
在算法定义类中声明模板方法和各个算法步骤方法,在模板方法中调用各个算法步骤方法。由子类:算法步骤的实现类实现或重载这些步骤方法。
示例:
public abstract class AbstractClass
{
//模板方法
public void TemplateMethod(){
//流程调用各个算法步骤
OperationA();
OperationB();
}
protected abstract void OperationA();
protected abstract void OperationB();
}
public class ConcreteClassA : AbstractClass
{
protected override void OpertaionA(){
//实现算法步骤A
}
protected override void OpertaionB(){
//实现算法步骤B
}
}
应用场景和优点:
单一职责、开闭、依赖倒置:细分粒度,分离了算法步骤的实现。
1、降低维护难度,方便修改和增加能用的算法步骤。
2、使原来的类的算法流程不再依赖具体的算法步骤,而能够改变算法步骤。
缺点:
无
应用:法术执行流程,登陆流程(配合策略模式)
参考:
《设计模式与游戏完美开发》
《HeadFirst设计模式》