从解耦谈设计模式

简介:

   解耦其实软件设计中永恒不变的话题。“部分”设计模式诞生的原因就是为了解耦。如代理模式,工厂模式,监听者模式等。探寻设计模式的本质其实就是探寻软件解耦。 


简单例子说明之:下面是“我要抓小猪”的解耦过程:



如果用编程语言 说就是构造两类:我和小猪。这样两个类之间存在着很强的耦合关系。如图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();        
    }


}

   其实你就会发现上面的编程就是监听者设计模式。很容易理解吧!

  总结:

       解耦 完全靠第三者,套用流行的一句话  “解耦 小三功不可没”。

       不过有时候第三者,可是充当“媒婆”,专门来撮合的,如适配器模式。后面我们再去研究。

       

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中常用的解耦设计模式包括工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、观察者模式和命令模式等。这些设计模式的共同点是将程序的业务逻辑与实现细节分离,从而提高代码的可读性和可维护性,同时也方便了代码的重用和扩展。 其中,工厂模式和抽象工厂模式可以将对象的创建和使用分离,使得程序更加灵活;适配器模式可以将不兼容的接口转换为兼容的接口,使得不同的类可以协同工作;装饰者模式可以动态地为对象添加新的功能,而不需要修改原有的代码;代理模式可以为其他对象提供一个代理,从而控制对该对象的访问;外观模式可以为复杂的子系统提供一个简单的接口,使得客户端可以更加方便地使用该子系统;桥接模式可以将抽象部分和实现部分分离,从而使得它们可以独立地变化;组合模式可以将对象组合成树形结构,从而使得客户端可以像处理单个对象一样处理整个树形结构;享元模式可以共享对象,从而减少内存的使用;观察者模式可以将对象的状态和行为分离,从而使得对象可以更加灵活地响应变化;命令模式可以将请求封装成对象,从而使得请求可以被记录、撤销和重做。 下面是一个使用工厂模式的例子: ```c++ #include <iostream> using namespace std; // 抽象产品类 class Product { public: virtual void use() = 0; }; // 具体产品类A class ProductA : public Product { public: void use() { cout << "ProductA" << endl; } }; // 具体产品类B class ProductB : public Product { public: void use() { cout << "ProductB" << endl; } }; // 抽象工厂类 class Factory { public: virtual Product* createProduct() = 0; }; // 具体工厂类A class FactoryA : public Factory { public: Product* createProduct() { return new ProductA(); } }; // 具体工厂类B class FactoryB : public Factory { public: Product* createProduct() { return new ProductB(); } }; int main() { Factory* factory = new FactoryA(); Product* product = factory->createProduct(); product->use(); delete product; delete factory; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值