设计模式之组件协作模式

设计模式学习

设计模式的作用是 在稳定和变化之间寻找一个间隔层,将稳定部分和变化分割开,提高软件复用性。

一、软件设计思想

1.理解松耦合设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF 核心设计模式

二、设计原则

1.依赖倒置原则(DIP)

稳定(抽象) 依赖 稳定; 不稳定 (实现细节,易变化)依赖 稳定。

2.开放封闭原则(OCP)

对扩展开放,对更改封闭;就是增加一个需求时,只需要增加代码就好,而不是去修改以往代码。具有扩展性

3、单一职责原则

一个类只有一个责任

4.Liskov替换原则

子类必须能够替换他们的基类(IS-A)

5.接口隔离原则

接口应该小而完备;不对外暴露的接口就使用private

6.优先使用对象组合,而不是继承

因为继承的话 父类和子类耦合度较高,组合的耦合性低,只需弄好接口

7 封装变化点

使用封装来创建对象之间的分界层,设计者在一侧修改而不会对另一侧产生不良影响

8 针对接口编程 ,而不是针对实现编程

接口返回值是一个抽象类

三、重构技法

静态->动态 早绑定->晚绑定 继承->组合 编译时依赖->运行时依赖 紧耦合->松耦合

四、具体设计模式

1.策略模式Template Method

有一个卫星任务规划软件,内含多颗卫星的任务规划,以下是一种做法;

enum class Satellite{ // 卫星代号
    GF_1,
    GF_2,
    GF_3
};
class SatelliteTaskPlan // 卫星任务规划类
{
private:
    /* data */
    Satellite SateNumber;
public:
    int TaskPlan(){
        /* code */
        if(SateNumber==Satellite::GF_1){
            /* code */
        }else if (SateNumber==Satellite::GF_2)
        {
            /* code */
        }else if (SateNumber==Satellite::GF_3)
        {
            /* code */
        }
    }
    SatelliteTaskPlan(/* args */);
    ~SatelliteTaskPlan();
};

但此做法违反了设计原则2:开闭原则,如果添加高分4号、5号等,就需要更改代码,而不是添加代码,复用性降低了。考虑重构:

class SatelliteStrategyBase // 卫星任务规划基类
{
public:
    virtual int TaskPlan(const Context &context) = 0;
    virtual ~SatelliteStrategyBase();
};

class TaskPlanForGF_1 : public SatelliteStrategyBase
{
public:
    virtual int TaskPlan(const Context &context)
    {
        /* code */
    }
};

class TaskPlanForGF_2 : public SatelliteStrategyBase
{
public:
    virtual int TaskPlan(const Context &context)
    {
        /* code */
    }
};

class TaskPlanForGF_3 : public SatelliteStrategyBase
{
public:
    virtual int TaskPlan(const Context &context)
    {
        /* code */
    }
};

class SatelliteTaskPlan // 卫星任务规划类
{
private:
    SatelliteStrategyBase *stra
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值