组合模式
单一职责原则
定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
里氏替换原则
定义:所有引用基类的地方必须能透明地使用其子类的对象。
依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
迪米特法则
定义:一个对象应该对其他对象保持最少的了解。
开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
我们首先来看一下组合模式的定义: 将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性
也就是说需要为单个和组合对象提供统一的接口来访问
那么一个实际的问题来源是什么?
就像文本编辑一样,你可以一个一个的改变字的颜色,粗细,字体,也可以一段一段的修改,也就是部分和整体一样的情况
那下面我们就来看一个例子:
我们就来实现如上面这个例子:
当然这个模式主要用的也是运行时的多态,具体思路如下:
由于,局部和整体的操作一直,所有就可以抽象出一个夫类,夫类里面有他们一致的方法
abstract class root { protected root rot=null; protected virtual string name { get; set; } public abstract void add(root t); public abstract void show(int depth);//depth深度 public root(string name) { this.name = name; } }
然后就是"树根"了
class shucha:root//树杈 { private List<root> Troot = new List<root>(); public shucha(string name) : base(name) { } public override void add(root t) { Troot.Add(t); } public override void show(int depth) { Console.WriteLine(new string('-', depth) + this.name); foreach (root item in Troot) { item.show(depth+2); } } }
然后就是"树叶"了
class shuyei:root//树叶 { public shuyei(string name) : base(name) { } public override void add(root t){} public override void show(int depth) { Console.WriteLine(new string('-',depth)+this.name); } }
然后就可以执行了
static void Main(string[] args) { shucha s = new shucha("主树根"); s.add(new shuyei("我是树叶一")); s.add(new shuyei("我是树叶二")); shucha s1 = new shucha("我是次树根"); s.add(s1); s1.add(new shuyei("我是树叶三")); s1.add(new shuyei("我是树叶四")); s.show(1); Console.Read(); } }
Hold on, everything is possible.