设计模式之禅笔记
在面向对象程序设计中,遇到问题之后总结问题的成功经验和最佳实践形成了设计模式
设计模式有为人熟知的六大原则
六大原则
● 单一职责
要求一个接口或者一个类只有一种职责;
● 里氏替换
A类对应的对象a,都可以由B类任意的对象所替换,功能正常,就说B是A的子类;
最清晰的定义:所有引用基类的地方必须能透明地使用其子类的对象。
● 依赖倒置
高层模块不应该依赖低层模块,两者都应该依赖其抽象;(实现类不应该相依赖,应通过抽象类活接口进行依赖)
抽象不应该依赖细节;(接口或者抽象类不应该依赖实现类)
细节应该依赖抽象;(实现类应该依赖抽象类或者接口)
● 接口隔离原则
接口细化,但是粒度过小也是不明智的,会导致接口剧增,推荐根据经验和常识决定接口的粒度大小;
● 迪米特法则
最少知识原则,一个类应该对自己需要耦合或调用的类知道得最少;
● 开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
将这六大原则结合使用能使设计模式更加稳固,灵活,健壮;但是并不是绝对的遵守这六大原则,要结合自己项目的实际功能去尽可能的贴合,例如接口隔离原则;这六大原则基本可以应对大多数的变化,但是适当时候也可以根据实际情况扩充一些规则,类的编写要尽可能的保持高内聚,低耦合。
MVC很容易被混淆,MVC其实不是设计模式,而是架构模式,也可以说是框架,基于这种架构可以设计出一些框架,例如Spring;
如何看懂设计模式
首先设计模式的文章书籍一般是由UML类图和时序图进行讲解的,所以关于UML类图和时序图我们需要具备可以看懂的基本能力;
类图的关系有这几种:泛化,实现,关联、聚合、组合、依赖;在图中是通过实线/虚线,箭头形状等进行区分的;如下图:

时序图指的是序列图/UML交互图,主要体现对象是怎么交互的,并且把重点放在消息序列上,时序图有两个坐标轴,纵轴表示时间,横轴表示对象,下面是网上找到的适配器模式时序图,可以结合再下面的适配器模式举例进行理解;

设计模式举例
设计模式分为三大类:创建型设计模式(例如单例模式),结构性设计模式(例如适配器模式),行为型设计模式(例如观察者模式);下面就适配器模式进行分析,之后再各类型进行补充;
适配器模式(结构型)
分为类适配器和对象适配器
类适配器的UmL图如下:

target想要调用request()方法,但是Adaptee没有该方法,所以提供了一个中间缓解adapter类,继承Adaptee的接口,实现target接口;
adapter:指适配器
简易代码如下(java):
public interface Target {
//这是源类Adapteee没有的方法
public void Request();
}
//源 类
public class Adaptee {
public void SpecificRequest(){
}
}
//适配器Adapter继承Adaptee,同时实现目标(Target)接口。
public class Adapter extends Adaptee implements Target {
//适配器是将SpecificRequest()方法作了一层封装,封装成Target可以调用的Request()
@Override
public void Request() {
this.SpecificRequest();
}
}
// 具体使用时的类,实例化一个Adapter类,调用request方法
public class AdapterPattern {
public static void main(String[] args){
Target mAdapter = new Adapter();
mAdapter.Request();
}
对象适配器

场景和类适配器相同,target类想要调用Adaptee的request()方法,但是Adaptee没有,所以adapter类作为一个中间类,实例化了一个Adaptee的对象,以此把target和Adaptee连接起来
代码上的区别只有adapter类以及使用适配器的方式不相同,前面创建target接口以及被适配的类Adaptee就不再重复;
class Adapter implements Target{
// 直接关联被适配类
private Adaptee adaptee;
public Adapter (Adaptee adaptee) {
this.adaptee = adaptee;
}
// 实现了一个request方法用来给target类进行调用
@Override
public void Request() {
// 这里是使用委托的方式调用SpecificRequest()
this.adaptee.SpecificRequest();
}
}
public class AdapterPattern {
public static void main(String[] args){
//创建一个被适配类的对象作为参数传入Adapter
Target mAdapter = new Adapter(new Adaptee());
mAdapter.Request();
}
}
适配器模式主要用于把一个接口转换成客户需要的另一个接口;也可以叫包装器;可以将两个没有关系的类结合在一起运行;增加了透明度,target不需要去了解adaptee内部是多么复杂,仅通过adapter类去调用自己需要的方法即可;这个模式大多是用户系统扩展时使用;
总结
设计模式是由前人的经验总结出来的一种思想;仅仅看了书籍或者文章是很难去真正理解或变成自己的知识的,最好还是通过代码实现进行理解,会更利于记忆,也能在下次编写代码时能很容易的应用设计模式的思想;这边只写了适配器模式,但是还有二十多种其他的设计模式,其中常用的还是需要深入的去理解;有什么问题欢迎指正~
本文是设计模式之禅笔记,介绍了面向对象程序设计中设计模式的六大原则,包括单一职责、里氏替换等,强调结合实际项目使用。还说明了看懂设计模式需具备UML类图和时序图的基本能力,并以适配器模式为例进行分析,指出通过代码实现理解设计模式更有效。

704

被折叠的 条评论
为什么被折叠?



