研磨设计模式文摘
来源:互联网 发布:ubuntu openstack 编辑:程序博客网 时间:2024/04/30 03:00
创建型 5
-----------------------------------------------------------------------------------------
1. Builder ------- 分离整体构建算法和部件构造
具体问题:数据导出格式(头,体,尾)
一般问题:同一个构建过程有着不同的表示
客户端:
2. Prototype ------- 克隆生成对象
具体问题:订单处理系统
一般问题:一个系统想要独立于它想要使用的对象
客户端:
Prototype newPrototype = prototype.clone();
3. Singleton -------- 控制实例数目
具体问题:读取配置文件的内容
----------------------------------------------------------------------------------------------------------------------
4. 简单工厂 -------- 选择实现
-----------------------------------------------------------------------------------------
5. Factory Method -------- 延迟到子类选择实现
6. Abstract Factory -------- 选择产品簇的实现
----------------------------------------------------------------------------------------
结构型 7
-----------------------------------------------------------------------------------------
1.Decorator ------- 动态组合
具体问题:复杂的奖金计算
一般问题:不影响其他对象的情况下,以动态,透明的方式给对象添加职责;
public abstract class Component { public abstract double calcPrice(string user, DateTime begin, DateTime end); } public class ConcreteComponent : Component { public override double calcPrice(string user, DateTime begin, DateTime end) { return 0; } } public abstract class Decorator : Component { protected Component _c; public Decorator(Component c) { this._c = c; } public override double calcPrice(string user, DateTime begin, DateTime end) { return this._c.calcPrice(user, begin, end); } } public class MonthPrizeDecorator : Decorator { public MonthPrizeDecorator(Component c) : base(c) { } public override double calcPrice(string user, DateTime begin, DateTime end) { double money = base.calcPrice(user, begin, end); return money + 100; } } public class SumPrizeDecorator : Decorator { public SumPrizeDecorator(Component c) : base(c) { } public override double calcPrice(string user, DateTime begin, DateTime end) { double money = base.calcPrice(user, begin, end); return money + 1000; } } public class GroupPrizeDecorator : Decorator { public GroupPrizeDecorator(Component c) : base(c) { } public override double calcPrice(string user, DateTime begin, DateTime end) { double money = base.calcPrice(user, begin, end); return money + 10000; } }
客户端:
Component c1 = new ConcreteComponent(); Decorator d1 = new MonthPrizeDecorator(c1); d1.calcPrice("aa", DateTime.Now, DateTime.Now); Decorator d2 = new SumPrizeDecorator(d1); d2.calcPrice("bb", DateTime.Now, DateTime.Now); Decorator d3 = new GroupPrizeDecorator(d2); d3.calcPrice("cc", DateTime.Now, DateTime.Now);
2.Composite ------- 统一叶子对象和组合对象
具体问题:商品类别树;
一般问题:部分整体层次结构;统一地使用组合结构中的所有对象;
客户端:
Component root = new Composite(“服装”);
Component c1 = new Composite(“男装”);
Component c2 = new Composite(“女装”);
Component leaf1 = new Leaf(“衬衣”);
Component leaf2 = new Leaf(“夹克”);
Component leaf3 = new Leaf(“裙子”);
Component leaf4 = new Leaf(“套装”);
root.addChild(c1);
root.addChild(c2);
c1. addChild(leaf1);
c1. addChild(leaf2);
c2. addChild(leaf3);
c2. addChild(leaf4);
3.Adapter ------- 转换匹配,复用功能
具体问题:同时支持数据库和文件的日志管理
一般问题:转换接口;复用类;
客户端:
Adaptee adaptee = new Adaptee ();
Target target = new Adapter(adaptee);
target.request();
4.Facade ------- 封装交互简化调用
具体问题:代码生成三层模块
一般问题:复杂的子系统提供一个简单的接口;客户程序和抽象类的实现部分松散耦合;
构建多层结构的系统;
Class Façade
{
Public void test()
{
AModultApi a = new AModuleImpl();
a.testA();
BModultApi b = new BModuleImpl();
b.testB();
}
}
客户端:
new Façade().test();
5.Flyweight ------- 分离与共享
具体问题:权限中读取缓存中的数据
一般问题:如果一个应用程序使用了大量的细粒度对象
6.Proxy ------- 控制对象访问
具体问题:读取大量数据问题
一般问题 :(1)虚代理:需要创建开销很大的对象; (2)保护代理:控制对原始对象的访问,判断权限;(3)远程代理:为一个对象在不同的地址空间提供局部代表;(4)智引代理:在访问对象执行一些附加操作;
7.Bridge ------- 分离抽象和实现
具体问题:发送消息(内部,邮件,手机)(普通,加急,特急)
一般问题:抽象部分和实现部分能够扩展;采用继承的方案,产生很多类;
public interface MessageImplementor { void send(string message, string toUser); } public interface AbstractMessage { void sendMessage(string message, string toUser); } public class MessageSMS : MessageImplementor { public void send(string message, string toUser) { Console.WriteLine("站内短消息发送" + message + toUser); } } public class MessageEmail : MessageImplementor { public void send(string message, string toUser) { Console.WriteLine("e-mail发送" + message + toUser); } } public class CommonMessage : AbstractMessage { private MessageImplementor _impl; public CommonMessage(MessageImplementor impl) { this._impl = impl; } public void sendMessage(string message, string toUser) { this._impl.send(message, toUser); } } public class UrgencyMessage : AbstractMessage { private MessageImplementor _impl; public UrgencyMessage(MessageImplementor impl) { this._impl = impl; } public void sendMessage(string message, string toUser) { this._impl.send(message, toUser); } }
客户端:
MessageImplementor impl = new MessageSMS(); AbstractMessage m = new CommonMessage(impl); m.sendMessage("aa","bb"); impl = new MessageEmail(); m = new CommonMessage(impl); m.sendMessage("cc","dd");
行为型 11
1. Strategy ------- 分离算法,选择实现
具体问题:向客户包报价
一般问题:封装算法;同一个算法,不同实现;if /else语句
客户端:
Strategy strategy = new ConcreteStrategyA();
Context context = new Context(strategy);
context.contextInterface();
2. State ------- 根据状态来分离和选择行为
具体问题:在线分类投票
一般问题:一个对象的行为取决于状态;依赖于状态的多分支结构;
3. Command ------- 封装请求
具体问题:开机模式
一般问题:不同的时刻指定,排列,执行请求; undo;
客户端:
Receicer receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.runCommand();
4. Observer ------- 触发联动
具体问题:订阅报纸;
一般问题:操作依赖于状态的变化;更改一个对象,连同更改其他对象;
客户端:
ConcreteSubject subject = new ConcreteSubject ();
ConcreteObserver a1 = new ConcreteObserver ();
a1.setName(“张三”);
ConcreteObserver a2= new ConcreteObserver ();
a2.setName(“李四”);
ConcreteObserver a3 = new ConcreteObserver ();
a3.setName(“王五”);
subject.attach(a1);
subject.attach(a2);
subject.attach(a3);
subject.setContent();
5. Mediator -------- 封装交互
具体问题:主板上各个配件交互
一般问题:一组对象之间的通信;
客户端:
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA a = new ConcreteColleagueA (mediator) ;
mediator..setConcreteColleagueA(a);
a.someOperation();
6. Chain of Responsibility-------- 分离职责 ,动态组合
具体问题:申请聚餐费用项目经理——》部门经理——》总经理
一般问题:如果多个对象可以处理同一个请求,具体哪个对象处理请求,是运行动态确定
public abstract class Handler { protected Handler _successor = null; public void setSuccessor(Handler successor) { this._successor = successor; } public abstract string handleFeeRequest(string user, double fee); } public class ProjectManager : Handler { public override string handleFeeRequest(string user, double fee) { string str = string.Empty; if (fee < 500) { str = "项目经理处理!"; } else { if (this._successor != null) { return _successor.handleFeeRequest(user, fee); } } return str; } } public class DepManager : Handler { public override string handleFeeRequest(string user, double fee) { string str = string.Empty; if (fee < 1000) { str = "部门经理处理!"; } else { if (this._successor != null) { return _successor.handleFeeRequest(user, fee); } } return str; } } public class GeneralManager : Handler { public override string handleFeeRequest(string user, double fee) { string str = string.Empty; if (fee >= 1000) { str = "总经理处理!"; } else { if (this._successor != null) { return _successor.handleFeeRequest(user, fee); } } return str; } }
客户端:
Handler h1 = new GeneralManager(); Handler h2 = new DepManager(); Handler h3 = new ProjectManager(); h3.setSuccessor(h2); h2.setSuccessor(h1); Console.WriteLine(h3.handleFeeRequest("aa", 400)); Console.WriteLine(h3.handleFeeRequest("aa", 600)); Console.WriteLine(h3.handleFeeRequest("aa", 1400));
输出:
项目经理处理!
部门经理处理!
总经理处理!
7. Visitor ----- 预留回路,回调实现
具体问题:客户管理增加偏好分析和价值分析
一般问题:给对象结构中的元素对象定义新的操作;
模式使用前:
public abstract class Customer { public string customerId { get; set; } public string name { get; set; } public abstract void serviceRequest(); public abstract void predilectionAnalyze(); public abstract void worthAnalyze(); } public class EnterpriseCustomer : Customer { public string linkman { get; set; } public string linkTelephone { get; set; } public string registerAddress { get; set; } public override void serviceRequest() { Console.WriteLine(this.name + "企业提出服务请求!"); } public override void predilectionAnalyze() { Console.WriteLine(this.name + "企业偏好分析!"); } public override void worthAnalyze() { Console.WriteLine(this.name + "企业价值分析!"); } } public class PersonalCustomer : Customer { public string telephone { set; get; } public int age { set; get; } public string registerAddress { get; set; } public override void serviceRequest() { Console.WriteLine(this.name + "客户提出服务请求!"); } public override void predilectionAnalyze() { Console.WriteLine(this.name + "各户偏好分析!"); } public override void worthAnalyze() { Console.WriteLine(this.name + "各户价值分析!"); } }
static void Main() { List<Customer> cols = testData(); foreach(Customer col in cols) { col.predilectionAnalyze(); col.worthAnalyze(); } } static List<Customer> testData() { List<Customer> col = new List<Customer>(); Customer cm1 = new EnterpriseCustomer(); cm1.name = "a"; col.Add(cm1); Customer cm2 = new EnterpriseCustomer(); cm2.name = "b"; col.Add(cm2); Customer cm3 = new PersonalCustomer(); cm3.name = "b"; col.Add(cm3); return col; }
输出:
a企业偏好分析!
a企业价值分析!
b企业偏好分析!
b企业价值分析!
b各户偏好分析!
b各户价值分析!
模式使用后:
public abstract class Customer { public string customerId { get; set; } public string name { get; set; } public abstract void accept(Visitor visitor); //public abstract void serviceRequest(); //public abstract void predilectionAnalyze(); //public abstract void worthAnalyze(); } public class EnterpriseCustomer : Customer { public string linkman { get; set; } public string linkTelephone { get; set; } public string registerAddress { get; set; } //public override void serviceRequest() //{ // Console.WriteLine(this.name + "企业提出服务请求!"); //} //public override void predilectionAnalyze() //{ // Console.WriteLine(this.name + "企业偏好分析!"); //} //public override void worthAnalyze() //{ // Console.WriteLine(this.name + "企业价值分析!"); //} public override void accept(Visitor visitor) { visitor.visitEnteroriseCustomer(this); } } public class PersonalCustomer : Customer { public string telephone { set; get; } public int age { set; get; } public string registerAddress { get; set; } //public override void serviceRequest() //{ // Console.WriteLine(this.name + "客户提出服务请求!"); //} //public override void predilectionAnalyze() //{ // Console.WriteLine(this.name + "各户偏好分析!"); //} //public override void worthAnalyze() //{ // Console.WriteLine(this.name + "各户价值分析!"); //} public override void accept(Visitor visitor) { visitor.visitPersonalCustomer(this); } } public interface Visitor { void visitEnteroriseCustomer(EnterpriseCustomer ec); void visitPersonalCustomer(PersonalCustomer pc); } public class ServiceRequestVisitor : Visitor { public void visitEnteroriseCustomer(EnterpriseCustomer ec) { Console.WriteLine(ec.name + "企业提出服务请求!"); } public void visitPersonalCustomer(PersonalCustomer pc) { Console.WriteLine(pc.name + "客户提出服务请求!"); } } public class PredilectionAnalyzwVisitor : Visitor { public void visitEnteroriseCustomer(EnterpriseCustomer ec) { Console.WriteLine(ec.name + "企业偏好分析!"); } public void visitPersonalCustomer(PersonalCustomer pc) { Console.WriteLine(pc.name + "各户偏好分析!"); } } public class WorthAnalyzwVisitor : Visitor { public void visitEnteroriseCustomer(EnterpriseCustomer ec) { Console.WriteLine(ec.name + "企业价值分析!"); } public void visitPersonalCustomer(PersonalCustomer pc) { Console.WriteLine(pc.name + "各户价值分析!"); } } public class ObjectStructure { private List<Customer> col = new List<Customer>(); public void handleRequest(Visitor visitor) { foreach(Customer cm in col) { cm.accept(visitor); } } public void addElement(Customer el) { this.col.Add(el); } }
ObjectStructure os = new ObjectStructure(); Customer cm1 = new EnterpriseCustomer(); cm1.name = "a"; os.addElement(cm1); Customer cm2 = new EnterpriseCustomer(); cm2.name = "b"; os.addElement(cm2); Customer cm3 = new PersonalCustomer(); cm3.name = "b"; os.addElement(cm3); ServiceRequestVisitor srVisitor = new ServiceRequestVisitor(); os.handleRequest(srVisitor); PredilectionAnalyzwVisitor paVisitor = new PredilectionAnalyzwVisitor(); os.handleRequest(paVisitor); WorthAnalyzwVisitor waVisitor = new WorthAnalyzwVisitor(); os.handleRequest(waVisitor);
输出:
a企业提出服务请求!
b企业提出服务请求!
b客户提出服务请求!
a企业偏好分析!
b企业偏好分析!
b各户偏好分析!
a企业价值分析!
b企业价值分析!
b各户价值分析!
8. Interpreter ----- 分离实现,解释执行
具体问题:读取配置文件
一般问题:当一个语言需要解释执行,语言中的句子表示为一个抽象语法树
9. Memento -------- 保护和恢复内部状态
具体问题:开发访真系统
一般问题:保存一个对象在某一个时刻的全部或者部分状态;
客户端:
Originator ori = new Originator(“test”);
ori.runPhaseOne();
Caretaker care = new Caretaker ();
Memento memento = ori.createMemento();
care saveMemento(memento);
ori. schemal1();
ori.setMemento(care.retireMemento());
ori.schemal2();
10. Template Method -------- 固定算法骨架
11. Iterator -------- 控制访问聚合对象中的元素
具体问题:访问List /数组的数据
一般问题:访问聚合对象
----------------------------------------------------------------------------------------------------------------------
- 研磨设计模式文摘
- 研磨设计模式提纲
- 研磨设计模式
- 研磨设计模式
- 研磨设计模式转载
- 《研磨设计模式》读书笔记
- 设计模式文摘
- 随笔--研磨设计模式[不断更新]
- 研磨设计模式之迭代器
- 研磨设计模式之策略模式-1
- 研磨设计模式之策略模式-2
- 研磨设计模式之策略模式-3
- 研磨设计模式之策略模式-4
- 研磨设计模式之策略模式-5
- 研磨设计模式之策略模式-6
- 研磨设计模式之 命令模式
- 策略模式-6(研磨设计模式)
- 研磨设计模式之 装饰模式-4
- php分页和具体使用
- linux内核 kthread_run函数 理解学习
- CSS中关于UL在不同浏览器中的差异
- android动画
- wxPython - wx.lib.ogl - 移动画布上的内容
- 研磨设计模式文摘
- 交叉编译器环境搭建
- ZOJ - 3175 Number of Containers
- 谁说子网掩码的1必须连续?关于像255.255.0.255这样的非连续子网掩码
- AVI格式
- 重构与模式文摘
- ZOJ - 3179 Calculate With Abacus
- IT项目经理岗位职责
- 黑马程序员训练营:交通灯系统