软件构造心得之Final——设计模式 (课程完结撒花)
现在是2021年七月七日16点,铭记历史,悼念同胞,永怀先烈,吾辈自强。距离软件构造期末考试还有18个小时,
距离解放还有20个小时。在看往年题的时候,发现设计模式是考察的一个重点,也是一个难点,需要结合具体环境,需求进行合理的选择,于是重新阅读了一下老师给的关于设计模式的PPT,并结合自己的理解,进行了一些总结,如有不足,请多多指正。
一、工厂方法模式 Factory Method
工厂方法模式,故名思义,自己生产对象,委托其他类来根据自己的需求生产对象,主要有三种实现方法,具体如下:
1.设计多种工厂类,每种工厂类返回自己对应的实例
主要思想:具体实现类1与具体实现类2同时实现一接口,工厂类1与工厂类2同时实现一工厂接口,工厂类1中的工厂方法返回具体类1的实例,工厂类2中的工厂方法返回具体类2的实例,在客户端使用时,通过对需要的工厂类实例化调用其工厂方法来获得所需要的具体实例。
2.根据条件判断返回
主要思想:基本实现原理同上,但仅用一个工厂类来实现工厂接口,在工厂类中根据参数的不同返回不同的具体类的实例。
3.静态工厂方法
主要思想:同理2,仅用一个工厂类来实现工厂接口,在工厂类中定义静态方法,不必每次调用的时候都创建新的工厂对象,通过类名调用即可。
二、适配器模式 Adapter
本质是一个转接头,将某个类 / 接口转换为客户端期望的其他形式,比如调用某个方法时参数的定义不一样(极坐标,角坐标)
主要思想:通过一个适配器实现类实现一个适配器借口,在该类中委托一个具体类完成客户端所需要的功能,但在委托之前对客户端传过来的参数进行处理,如极坐标 → \rightarrow → 角坐标,客户端若想使用具体类的功能无需对参数进行处理,只需调用适配器实现类即可。
三、装饰器模式 Decorator
简单说就是递归调用,层层包装
主要思想:具体类(待装饰)和基础装饰器类同时实现一个接口,基础装饰器类委托具体类完成基础功能,具体装饰器类继承基础装饰器类,并对需要装饰的方法进行重写,在构造函数中使用super()方法将基础功能让基础装饰器类委托具体类实现,客户端调用时只需如下递归调用即可。
Stack t = new CStack(new BStack(new AStack(new Stack())));
四、策略模式 Strategy
根据需要动态切换算法
主要思想:策略类1,策略类2,具体实现类同时实现一个接口,具体类将某个方法委托给策略类1或策略类2实现(通过函数参数不同来选择),客户端在调用某个策略时只需将对应策略类的实例化传递给具体类实例即可。
五、模版模式 Template
做事情的步骤一样,但具体方法不同,共性的步骤在抽象类内实现,差异步骤在具体子类实现
主要思想:在抽象类中实现通用逻辑(step1,step2……),具体类1和具体类2继承抽象类重写个性化方法(step,step2……)。
六、迭代器 Iterator
主要思想:需要迭代的类继承Iterable,重写boolean hasNext(),E next(),void remove()方法即可。
七、Visitor
为ADT预留一个可扩展功能的“接入点”,外部实现的功能可在不改变ADT的前提下通过委托接入ADT
主要思想:具体类1和具体类2重写接口中的accept(Visitor visitor),并在其中增加visitor.visit(this)提供接入点给visitor,通过一个VisitorImpl实现类实现Visitor接口,通过visit方法传递不同的参数实现不同的功能。在客户端调用时需要实例化Visitor类作为参数调用具体类中的accept完成需要的功能。