核心和前面一样,不同策略实现同一个接口,聚合到Context类中。也是为了避免多重判断,扩展性好,可以随意切换新增算法。像商场里的打折促销满减不同活动,可能会有人想到,不同策略的选择还是需要判断语句,可以结合简单工厂进一步处理。追求极致那就反射喽。反射反射,程序员的快乐。
11、Visitor 访问者访问者模式应该是这里面最复杂的,大多数时候你并不需要使用它。因为访问者模式表示作用于某对象结构中各元素的操作,它使你在不改变元素的类的前提下定义新操作,而对象数据结构是在不变的情况下。
不要怕这个结构图,一共就两个部分,首先提供访问者Visitor类,它的子类就是具体的对元素的操作算法,然后ObjectStructure就是元素集合类,里面遍历每个元素执行元素相对应的算法。所以关键就在下面部分Element类中将Visitor作为输入参数。
核心就是在被访问者的类中加一个对外提供接待访问者的接口,也就是在数据元素类中有一个方法接收访问者,将自身引用传入访问者,像下面示例这样
class ConcreateElementA : Element{
public override void Accept(Visitor visitor)
{
visitor.VisitorConcreateElementA(this);
}
}
class ObjectStructure
{
private List<Element> elements = new List<Element>();
public void Attach(Element element)
{
elements.Add(element);
}
public void Detach(Element element)
{
elements.Remove(element);
}
public void Accept(Visitor visitor)
{
foreach (Element e in elements)
{
e.Accept(visitor);
}
}
}
在对象结构很少变动,需要在此对象结构上定义新的操作或者本身它就有很多不相关的操作时可以考虑使用此模式。
谢谢设计模式可能对于小白来说高大上,其实你实际也经常会使用到,只是不知道那就是设计模式,“优秀”总是那么相似。
不用刻意去追求设计模式,一个问题也可能有很多解决方案,往良好的设计去优化。自己用的多了,就知道什么场景使用什么设计,最终会与大神不谋而合的。
主要参考程杰的《大话设计模式》