简介:
解耦其实软件设计中永恒不变的话题。“部分”设计模式诞生的原因就是为了解耦。如代理模式,工厂模式,监听者模式等。探寻设计模式的本质其实就是探寻软件解耦。
简单例子说明之:下面是“我要抓小猪”的解耦过程:
如果用编程语言 说就是构造两个类:我和小猪。这样两个类之间存在着很强的耦合关系。如图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();
}
}
其实你就会发现上面的编程就是监听者设计模式。很容易理解吧!
总结:
解耦 完全靠第三者,套用流行的一句话 “解耦 小三功不可没”。
不过有时候第三者,可是充当“媒婆”,专门来撮合的,如适配器模式。后面我们再去研究。