设计模式行为型[上]
原创
©著作权归作者所有:来自51CTO博客作者wx635f66b1406d4的原创作品,请联系作者获取转载授权,否则将追究法律责任
概念
用来识别对象之间的常用交流模式并加以实现。如此,可在进行这些交流活动时增强弹性。
模板方法
1.基础概念
模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
2.类图
分析类图我们可以得知:父类给出的是抽象的算法骨架,具体的方法怎么做留给了具体的子类。
代码
internal class Program
{
static void Main(string[] args)
{
//调用的时候想用那个具体子类的算法,实例化的就是那个子类的对象
AbstractClass class1 = new ConcreteClass();
class1.TemplateMethod();
}
}
abstract class AbstractClass
{
//定义的算法的执行骨架
public void TemplateMethod()
{
//算法的执行顺序
PrimitiveOperation1();
PrimitiveOperation2();
}
//子类里面可以更改的算法
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
}
//具体的子类
class ConcreteClass : AbstractClass
{
//具体子类实现
public override void PrimitiveOperation1()
{
Console.WriteLine("子类对算法的方法1的具体实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("子类对算法的方法2的具体实现");
}
}
模板方法如果想要扩展的话,就创建一个新的类来继承模板,将具体的算法的实现进行更改,使用的时候用哪个具体方法,实例化那个具体的对象就可以了。
策略模式
概念 :
策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
类图:
策略模式主要由三部分构成
- 抽象策略(CashSuper)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(CashNormal1)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(CashContext)类:持有一个策略类的引用,最终给客户端调用。
代码
static void Main(string[] args)
{
//这里调用的是第一个策略
CashSuper cashSuper = new CashNormal();
CashContext cashContext = new CashContext(cashSuper);
cashContext.GetResult();
}
abstract class CashSuper
{
//抽象的收费策略
public abstract void acceptCash();
}
class CashNormal : CashSuper
{
//第一种具体策略
public override void acceptCash()
{
Console.WriteLine("这是第一种策略");
}
}
class CashRebate : CashSuper
{
public override void acceptCash()
{
Console.WriteLine("这是第二种策略");
}
}
class CashReturn : CashSuper
{
public override void acceptCash()
{
Console.WriteLine("这是第三种策略");
}
}
//保存的策略类的引用
class CashContext
{
private CashSuper cashSuper;
//传入具体的策略对象
public CashContext(CashSuper cashSuper)
{
this.cashSuper = cashSuper;
}
//调用策略类的方法,传入的什么对象,就调用那个策略
public void GetResult()
{
cashSuper.acceptCash();
}
}
如果有新增业务的话,新增一个策略子类,继承抽象的策略类,调用的时候通过环境类进行调用就可以了。