看上面代码,估计大都用过,设计模式好多都是这种普普通通,数据库连接池就是使用享元模式。总结下就是在系统中有大量相似对象或者需要缓冲池的场景,相似对象可以分离出内部和外部状态,内部状态就是固有的,不变的。外部状态可以通过外部调用传递进去。
6、Proxy 代理像代购一样,我们拜托他人帮我们买某个东西。代理模式就是用一个类代表另一个类的功能。通常在不方便直接访问原始对象功能,或者需要对原始对象功能增加一些权限或其他控制时使用代理模式。
核心就是增加代理层,让代理类和真实类都实现相同的接口(或抽象类),然后把真实类关联到代理类中。
上述结构图中的核心代码如下
class Proxy : Subject{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}
代理模式其实就是在访问对象时引入一定程度的间接性,因此可以附加多种用途。
7、Facade外观外观模式隐藏系统的复杂性,向客户端提供一个高层访问系统接口。这样降低访问复杂系统的内部子系统时的复杂度,简化客户端交互,就像公司前台。
核心就是将复杂系统里的类关联到外观类上。上面结构图就很清晰,通过外观类方法调用各个复杂系统类。
这种方式对老系统尤其有用,新增功能需要用到旧类,如果怕改坏了,就可以简单实用外观封装。还有就是设计时经典的三层架构也是外观的体现。
行为型行为型设计模式关注对象和行为的分离。行为型比较多,因为程序逻辑都需要行为来触发。
1、Interpreter 解释器解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。有点拗口,简单理解就是对于一些固定文法构建一个解释句子的解释器。像正则表达式就是这样,查询匹配字符问题发生的频率很高,就把该问题各个实例表述为一个简单语言中的句子,解释句子来解决问题。比例谍战片中的加密电报,构建一个解释器对每个文法解析。
核心就是构建语法数,定义终结符与非终结符。实际利用的场景还是比较少的,而且文法太复杂也很难维护。
实际客户端调用时像下面这样遍历解释器文法
List<AbstractExpression> list = new ArrayList<>();
list.Add(new TerminalExpression());
list.Add(new NonterminalExpression());
list.Add(new TerminalExpression());
list.Add(new TerminalExpression());
foreach (AbstractExpression abstractExpression in list)
{
abstractExpression.Interpret(context);
}
2、Template Method 模板方法
在模板方法中,一个抽象类公开定义一个算法的执行方式模板,而将一些步骤延迟到子类中,子类可以按需要重写方法实现,但调用统一使用抽象类中定义的方式调用。
上面结构图中AbstractClass就是一个抽象类(抽象模板),定义并实现了一个模板方法。像下面这样