从解耦谈设计模式
2014-01-10 15:32
357 查看
简介:
解耦其实软件设计中永恒不变的话题。“部分”设计模式诞生的原因就是为了解耦。如代理模式,工厂模式,监听者模式等。探寻设计模式的本质其实就是探寻软件解耦。
简单例子说明之:下面是“我要抓小猪”的解耦过程:
如果用编程语言 说就是构造两个类:我和小猪。这样两个类之间存在着很强的耦合关系。如图1.
现在为两个类解耦,或者你根本没有解耦概念,但是可能有通过猎人抓小猪的想法。其实你已经为最初的需求“我要抓小猪”的两个作用体之间进行了解耦。此时加入第三者后,我不再与小猪发生关系 。如图2。
第三者解耦是编程中常用的解耦方法。君不见“小三”可是“疏离”关系的杀手!
此时变成了我和猎人存在着很强的耦合关系,
可以进一步解耦,我们又加入了一个第三者 “接口”,如图3。
此时变成了我跟接口发生关系,从编程上,又是面向接口编程。但是这次解耦从
编程上看,并不是完全解耦,因为猎人类的引用还是要转化为接口引用传递给我的。
下面我们用第三者解耦的思想和面向接口编程的思想来分析一下代理和观察者设计模式:
代理模式就不讲了,只要解耦那么就要使用第三者,就有一点代理的味道了。
观察者模式,其实也是一种解耦。
“我要开会,通知其他三人“ 见上图1.按照第三者解耦为
“我要开会,呼叫秘书,秘书通知每个人”见上图2.
按照上图2所示编程如下:
解耦其实软件设计中永恒不变的话题。“部分”设计模式诞生的原因就是为了解耦。如代理模式,工厂模式,监听者模式等。探寻设计模式的本质其实就是探寻软件解耦。
简单例子说明之:下面是“我要抓小猪”的解耦过程:
如果用编程语言 说就是构造两个类:我和小猪。这样两个类之间存在着很强的耦合关系。如图1.
现在为两个类解耦,或者你根本没有解耦概念,但是可能有通过猎人抓小猪的想法。其实你已经为最初的需求“我要抓小猪”的两个作用体之间进行了解耦。此时加入第三者后,我不再与小猪发生关系 。如图2。
第三者解耦是编程中常用的解耦方法。君不见“小三”可是“疏离”关系的杀手!
此时变成了我和猎人存在着很强的耦合关系,
可以进一步解耦,我们又加入了一个第三者 “接口”,如图3。
此时变成了我跟接口发生关系,从编程上,又是面向接口编程。但是这次解耦从
编程上看,并不是完全解耦,因为猎人类的引用还是要转化为接口引用传递给我的。
下面我们用第三者解耦的思想和面向接口编程的思想来分析一下代理和观察者设计模式:
代理模式就不讲了,只要解耦那么就要使用第三者,就有一点代理的味道了。
观察者模式,其实也是一种解耦。
“我要开会,通知其他三人“ 见上图1.按照第三者解耦为
“我要开会,呼叫秘书,秘书通知每个人”见上图2.
按照上图2所示编程如下:
package com.observer; public class me { private secretary ms;//增加一个属性代表我拥有一个秘书! public me(secretary s) { ms=s; } void meeting() { ms.notifyall("go to meeting");//让秘书干活 } }
package com.observer; public interface secretary { public void notifyall(String s); }
package com.observer; import java.util.ArrayList; import java.util.List; public class ConcreteSecretary implements secretary{ private List<member> members = new ArrayList<member>(); public void register(member m) { members.add(m); } @Override public void notifyall(String s) { // TODO Auto-generated method stub for(member m :members ){ m.update(s); //秘书挨个通知 } } }
package com.observer; public interface member { public void update(String s); }
package com.observer; public class Concretemember implements member{ private String m_state; private String m_name; // Constructors public Concretemember(String name) { m_name=name; } public void update(String s) { m_state=s; System.out.println(m_name+"收到"+m_state); } }
public class mainProgram {
public static void main(String[] args)
{
ConcreteSecretary s= new ConcreteSecretary();
member m1= new Concretemember("小王");
member m2= new Concretemember("小丽");
member m3= new Concretemember("小张");
s.register(m1);
s.register(m2);
s.register(m3);
me i= new me(s);
i.meeting();
}
}
其实你就会发现上面的编程就是监听者设计模式。很容易理解吧!
总结:
解耦 完全靠第三者,套用流行的一句话 “解耦 小三功不可没”。
不过有时候第三者,可是充当“媒婆”,专门来撮合的,如适配器模式。后面我们再去研究。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 设计模式之创建型模式
- 介绍php设计模式中的工厂模式
- 面向对象设计模式的核心法则
- 常见的PHP五种设计模式小结
- 小议javascript 设计模式 推荐
- javascript 设计模式之单体模式 面向对象学习基础
- 最常用的12种设计模式小结
- php设计模式 Command(命令模式)
- php设计模式介绍之值对象模式第1/5页
- 设计模式之构建(Builder)模式 建造房子实例分析
- Javascript 设计模式(二) 闭包
- javascript学习笔记(九) js对象 设计模式
- ASP.NET的适配器设计模式(Adapter)应用详解
- PHP设计模式之调解者模式的深入解析
- js如何实现设计模式中的模板方法
- 设计模式中的备忘录模式解析及相关C++实例应用
- 代理角色java设计模式之静态代理详细介绍