没有合适的资源?快使用搜索试试~ 我知道了~
以思维导图的方式,从定义、优缺点、适用场景、角色、UML、代码实现等多个角度去理解设计模式。包括对工厂模式、单例模式、适配器模式、装饰模式、命令模式、观察者模式等常用设计模式的讲述。
资源推荐
资源详情
资源评论
设计模式思维导图
设计模式概述
程序猿阿文制作
设计模式概述
一、设计模式
1.定义是从许多优秀软件系统中总结出的成功的可复用的解决方案。
2.基本要素名称:高度概括其本质;问题:何时使用,在什么环境下使用;方案:设计的组成成
分、相互关系及各自职责和协作方式;效果:灵活性、扩充性、复用性。
二、设计原则
1.面向抽象原则
抽象类:
可以有abstract或非abstract方法;
不能用new运算符创建对象;
非抽象类继承抽象类必须重写抽象类的abstract方法,且去掉abstract修饰符;
抽象类作为上转型对象(虽然抽象类不能用new创建对象,但可以让抽象类声明的对象成
为其子类的上转型对象,并调用子类重写方法)。
接口:
只能有public权限的abstract方法,不能有非abstract方法;
一个类实现接口,必须重写接口的abstract方法;
接口回调(可以把实现接口的类的对象的引用赋给该接口声明的接口变量中)。
2.开闭原则
设计对扩展开放,对修改关闭;用抽象构建框架,用实现扩展细节。
3.多用组合少用继承
继承复用:
优点:
-子类可重写父类方法。
缺点:
-无法在运行期间改变从父类继承的方法行为;
-子父类强耦合关系,父类改变必导致子类改变;
白盒复用(父类的内部细节对子类是可见的)。
组合复用:
优点:
-对象与所包含对象属于弱耦合关系;
-当前对象可在运行时动态指定所包含对象;
程序猿阿文制作
-黑盒复用(当前对象只能委托所包含的对象调用方法,当前对象所包含对象的方法的
细节当前对象是不可见的)。
缺点:
-导致系统对象过多;
-为组合多个对象,必须仔细对接口定义。
4.高内聚低耦合原则
利于类的维护。
5.单一职责原则
一个类只负责一项职责,不要存在多于一个导致类变更的原因。
6.里氏替换原则
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;子类中可以增加自己特有的方
法;当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入
参数更宽松;当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比
父类更严格。
7.依赖倒置原则/面向接口编程
高层模块不依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽
象。
8.接口隔离原则
使用多个专门的接口来替代一个统一的接口;一个类对另一个类的依赖应建立在最小的接口
上。
9.迪米特法则
一个类对自己依赖的类知道的越少越好。即,对于被依赖的类,无论逻辑多么复杂,尽量将逻
辑封装在类的内部。
三、设计模式分类
1.创建型模式设计对象实例化,不让用户依赖于对象的创建或排列方式,避免用户直接用new创
建对象。共五种:工厂方法模式、抽象工厂模式、单例模式;建造者模式、原型模式。
2.行为型模式合理设计对象之间相互通信,为对象分配职责,让设计富有弹性,易维护、易复用。
共十一种:命令模式、迭代器模式、观察者模式、备忘录模式、状态模式、模板方法模式;策略
模式、责任链模式、访问者模式、中介者模式、解释器模式。
3.结构型模式组合类和对象形成更大的结构。和类有关的结构型涉及合理使用继承机制;和对象
有关的结构型涉及使用用对象组合机制。共七种:适配器模式、装饰模式、外观模式;代理模
式、桥接模式、组合模式、享元模式。
四、UML类图
程序猿阿文制作
包括三层:名字层、属性层(变量层)、方法层(操作层)。
四种关系:
1.泛化关系即继承(表示方法:实线+三角形)。
2.关联关系A中变量是用B类(接口)来声明的变量(表示方法:实线的箭头)。
3.依赖关系A中某个方法参数是用B类来声明的变量或某个方法返回的数据类型是B型(表示方
法:虚线的箭头)。
4.实现关系即实现接口(表示方法:虚线+三角形)。
设计模式-工厂方法模式
工厂方法模式思维导图
1、定义
使一个类的实例化延续到其子类,定义一个用于创建对象的接口,让子类决定实例化哪一个类。(该
模式关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,让子类通过
重写抽象方法返回子类的实例。)
2、分类&别名
分类:创建型模式别名:虚拟构造
3、优点&缺点
优点:使用户与子类解耦;使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪
些方法;满足开闭原则。
程序猿阿文制作
缺点:创建的类多。
4、适用场景
用户需要该类的子类的实例,但不希望与该类的子类形成形成耦合;用户需要该类的子类的实例,但
用户不知道该类有哪些子类可用。
5、UML类图
四种角色:抽象产品Product:定义具体产品必须实现的方法。具体产品ConcreteProduct:继承
抽象产品类或者实现抽象产品接口,工厂类所创建的对象就是具体产品的实例。工厂构造者
Creator:定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。具体工厂构造者
ConcreteCreator:重写工厂方法,使该方法返回具体产品的实例。
总结:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂
类。每个具体工厂类只能创建一个具体产品类的实例。
6、代码实现
//step1.
抽
象
产
品
Product
:
定
义具体产
品
必
须
实
现
的
方
法
abstractclassLaptop{
protectedStringmark;
publicabstractStringgetId();
}
//step2.
具体产
品
ConcreteProduct
:
继
承抽
象
产
品
类
或
者
实
现
抽
象
产
品
接
口
classLenovoLaptopextendsLaptop{
LenovoLaptop(){
mark="Lenovo";
}
publicStringgetId(){
return"使用"+mark+"牌子的笔记本";
}
}
classAppleLaptopextendsLaptop{
AppleLaptop(){
mark="Apple";
}
publicStringgetId(){
return"使用"+mark+"牌子的笔记本";
程序猿阿文制作
剩余34页未读,继续阅读
资源评论
程序员阿文
- 粉丝: 16
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功