读书笔记----软件设计原则、设计模式

读书笔记----软件设计原则、设计模式

这个作业属于哪个课程 班级链接
这个作业要求在哪里 作业要求链接
这个作业的目标 1、学会自主查找阅读工具书并且提取出完整的知识脉络
2、将书中所学的东西通过结合自己的经历来思考实践并掌握

参考书籍

《软件秘笈:设计模式那点事》  作者:郑阿奇

书籍概述

  这本书在第1章软件设计模式概述后,从第2章到第24章诠释23个软件设计模式。每一种都以一个生活故事开始,然后是模式定义、模式分析、模式实现、设计原则和使用场合。模式实现通过Eclipse中的Java工程展开,采用软件编程诠释设计模式故事中的情节和操作,非常有趣。在这个基础上,总结该软件设计模式的设计原则,最后提出使用场合。第25章对各种软件设计模式进行系统总结,第26章是各种软件设计模式综合应用。

三大模式

思维导图

图片

模式分类

创建型:

  • 1.单例模式(Singleton):保证一个类只有一个实例,并提供一个访问它的全局访问点。
  • 2.抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
  • 3.工厂方法(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
  • 4.建造模式(Builder):讲一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
  • 5.原型模式(Peototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

结构型:

  • 6.组合模式(Composite):将对象组合树形结构以表示部分整体的关系。
  • 7.外观模式(Facade):为子系统中的一组接口提供一致的界面,façade提供了一高层接口。这个接口使得子系统更容易使用。
  • 8.代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
  • 9.适配器模式(Adapter):将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以在一起作用。
  • 10.装饰模式(Decrator):动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生产子类更加灵活。
  • 11.桥接模式(Biedge):将抽象部分与它的实现部分相分离,使他们可以独立的变化。
  • 12.享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。

行为型:

  • 13.迭代器模式(Iterator):提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
  • 14.观察者模式(Observer):定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
  • 15.模板方法(Temolate Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
  • 16.命令模式(Command):讲一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
  • 17.状态模式(State):允许对象在其内部状态改变时改变他的行为。
  • 18.策略模式(Strategy):定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
  • 19.职责链模式(ChinaOfResponibility):使多个对象都有机会请求处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  • 20.中介者模式(Mediator):用一个中介对象封装一些列的对象交互。
  • 21.访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素类的前提下定义作用域这个元素的新操作。
  • 22.解释器模式(Interpreter):给定一个语言,定义它的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
  • 23.备忘录模式(Memento):在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

七大原则

思维导图

原则含义

  • 开闭原则:在应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
  • 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
  • 依赖倒置原则:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。核心思想:要面向接口编程,不要面向实现编程。
  • 单一职责原则:单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。
  • 接口隔离原则:要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
  • 迪米特法则:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
  • 合成复用原则:软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

应用实例

package com.weirdo.principle.demeter.improve;
import java.util.ArrayList;
import java.util.List;
public class Demeter1 {
    public static void main(String[] args) {
        SchoolManager schoolManager = new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManager());
    }
}
//学校总部员工类
class Employee {
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
//学院的员工类
class CollegeEmployee {
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
//管理学院员工的管理类
class CollegeManager{
    //返回学院的所有员工
    public List<CollegeEmployee> getAllEmployee(){
        List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
        //增加了10个员工到list
        for (int i = 0; i < 10; i++) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工ID="+i);
            list.add(emp);
        }
        return list;
    }
    //输出学院员工的信息
    public void printEmployee(){
        //获取到学院员工
        List<CollegeEmployee>list1 = getAllEmployee();
        System.out.println("===========学院员工==============");
        for (CollegeEmployee e :list1) {
            System.out.println(e.getId());
        }
    }
}
//学校管理类
class SchoolManager{
    //返回学校总部的员工
    public List<Employee> getAllEmployee(){
        List<Employee>list = new ArrayList<Employee>();
        for (int i = 0; i < 5; i++) {
            Employee emp = new Employee();
            emp.setId("学校总部员工ID="+i);
            list.add(emp);
        }
        return list;
    }
    //该方法完成输出学校总部和学院员工信息(ID)
    void printAllEmployee(CollegeManager sub){
        //分析问题
        //1、将输出学院员工方法,封装到CollegeManager
        sub.printEmployee();

        //获取学院总部员工
        List<Employee>list2 = this.getAllEmployee();
        System.out.println("===========学院总部员工==============");
        for (Employee e :list2) {
            System.out.println(e.getId());
        }
    }
}

此处应用了迪米特法则,降低了类之间的耦合度,提高模块的相对独立性。
由于自己以前从未有过与这些法则相关的实际编码应用,所以此处参考了网上的例子。
参考链接:网页链接

编辑界面截图

posted @ 2021-06-18 00:59  乘月123  阅读(129)  评论(0)    收藏  举报