作业二:读书笔记----软件设计原则、设计模式

这个作业属于哪个课程 2022软件代码开发技术
这个作业要求在哪里 读书笔记----软件设计原则、设计模式
这个作业的目标 对于软件设计原则、设计模式的了解

参考书籍

参考自:《大话设计模式》

设计原则

设计原则 理解含义
单一职责原则 一个类只负责一个功能领域中的相应职责,即一个类只实现某个领域的相应职责,这样有利于进行调用。
开闭原则 软件实体应对扩展开放,而对修改关闭:就是当该类需要进行拓展(比如说添加一个新功能(方法))是可以的,但进行修改某功能则不可以。
里氏代换原则 所有引用基类对象的地方能够透明地使用其子类的对象,就是接口(基类、抽象类)进行定义,子类进行动态实现。
依赖倒换原则 抽象不应该依赖于细节,细节应该依赖于抽象。也就是需要面向接口编程,先把接口写好(明确业务),然后实现类进行具体实现。
接口隔离原则 使用多个专门的接口,而不使用单一的总接口。这样在维护时发现找寻具体功能点就相对简单,实现类里不过与庞杂
合成复用原则 尽量使用对象组合,而不是继承来达到复用的目的。(复用时应该多用关联,少用继承。)
迪米特法则 一个软件实体应当尽可能少地与其他实体发生相互作用。

设计模式

创建型模式

  • 工厂方法模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例。
  • 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • 建造者模式:复杂对象的创建与表示分离同样的构建过程可以创建不同的表示。
  • 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
  • 单例模式:一个类仅有一个实例

结构型模式

  • 适配器模式:使得两个不匹配的类可以一起工作
  • 桥接模式:分离抽象化和具体化,使二者可独立变化
  • 组合模式:分级的树形结构,使得单个对象和组合对象具有一致性
  • 装饰者模式:动态地给一个对象添加一些额外的职责,且不改变原类文件和使用继承
  • 外观模式:为子系统中的一组接口提供一个一致的界面
  • 享元模式:来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件
  • 代理模式:为其他对象提供一种代理以控制对这个对象的访问

行为型模式

  • 责任链模式:发出请求的客户端不知道哪一个对象最终处理这个请求
  • 命令模式:通过中间的命令者角色完成请求和实现间的解耦
  • 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
  • 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示
  • 中介者模式:用一个中介对象来封装一系列对象之间的交互,降低各个对象之间的耦合度
  • 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态
  • 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新
  • 状态模式:允许一个对象在其内部状态改变时改变它的行为
  • 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
  • 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
  • 访问者模式:使用户可以在不改变各元素类的前提下定义作用于这些元素的新操作

代码示例

C++中实现单例模式

// SmartSingleton.hpp
#include<memory>
#include<mutex>

template<typename SType>
class SmartSingleton
{
public:
    template<typename... Args>
    static std::shared_ptr<SType> GetInstance(Args&&... args)
    {
        std::lock_guard<std::mutex> lg(mutexLock);
        if (pInstance == nullptr)
        {
            // 缺点 调用不到私有的构造函数 除非对应类将std::make_shared设置为友元函数
            // pInstance = std::make_shared<SType>(std::forward<Args>(args)...);
            pInstance = std::shared_ptr<SType>(new SType(std::forward<Args>(args)...));
        }
        return pInstance;
    }

    SmartSingleton() = delete;
    SmartSingleton(const SmartSingleton&) = delete;
    SmartSingleton& operator=(const SmartSingleton&) = delete;
private:
    static std::shared_ptr<SType> pInstance;
    static std::mutex mutexLock;
};

template<typename SType>
std::shared_ptr<SType> SmartSingleton<SType>::pInstance = nullptr;

template<typename SType>
std::mutex SmartSingleton<SType>::mutexLock;

测试代码

class MyClass
{
    friend class SmartSingleton<MyClass>;
private:
    MyClass(std::string _name, int _num) : name(std::move(_name)), num(_num) { std::cout << "MyClass" << std::endl; }
    std::string name;
    int num;
public:
    ~MyClass() { std::cout << "~MyClass" << std::endl; }
};

int main()
{
    std::shared_ptr<MyClass> p = SmartSingleton<MyClass>::GetInstance("Chen", 10);
    // Whatever you want to do with p...
}

开发心得

设计模式需要在代码中灵活运用,才能实现代码的高内聚低耦合,使代码的可读性上升,使代码后期更方便维护。不可以在实际开发中生搬硬套设计模式,需要视情况使用

作业截图

posted @ 2022-05-03 20:54  TuaPu  阅读(30)  评论(0)    收藏  举报