什么是设计模式?
设计模式是一套代码前辈们的开发经验,踩坑然后分类的总结(个人理解)。下面是设计模式的一些原则:(主要目的还是为了提升代码的复用性,使系统变得稳定)
- “开-闭”原则:一个软件实体应当对扩展开放,对修改关闭。抽象化是关键
- 里氏代换原则:它说:任何基类可以出现的地方,子类一定可以出现。
- 依赖倒转原则:要依赖于抽象,不依赖于实现
- 合成/聚合复用原则:要尽量使用聚合/合成,而不是通过继承关系达到复用的目的
- 迪米特法则:一个软件实体应当于尽可能少的其他实体发生相互作用。
- 接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不是提供大的总接口。
这些设计原则首先都是复用的原则,遵循这些设计原则可以有效的提升系统的复用性,同时提高系统的可维护性。
这里我们要首先对设计模式中的命令模式进行了一些理解和demo的编写,来保证读者和笔者的正常理解。
从下图而言,该图就是诠释了什么是面向对象的编程方式,
首先我们是从执行者的角度出发,从这里我们只观察到我们的请求是什么,然后是什么来接受它,其实就我感觉,我们其实也不需要关心是谁来接收这个命令,只需要发出去命令就好了(这个暂且不论,我们还是要已这个类图来写程序的)。
按部就班的,我们还是要来一个demo:
代码结构:
首先是厨师的接收者(CookReceiver实现了 Receiver 的action方法):
public class CookReceiver implements Receiver { public CookReceiver() { System.out.println("创建厨师信息接收者..."); } public void action() { System.out.println("我是厨师!我来炒菜!"); } }
下一步,就该创建命令了(OrderCommand实现了 Command 的execute):
/** * 下单命令 */ public class OrderCommand implements Command { private Receiver receiver = null; public OrderCommand() { System.out.println("创建下单命令"); } public OrderCommand(Receiver receiver){ this.receiver = receiver; } /** * 执行命令 */ public void execute() { System.out.println("命令执行..."); receiver.action(); } public Receiver getReceiver() { return receiver; } }
在《HeadFirst 设计模式》中,创建命令的时候需要把该命令的接收者也要传递进去。
再下一步,就是创建请求者(ClerkInvoker实现了 Invoker 的call):
/** * 接待员请求者 */ public class ClerkInvoker implements Invoker { private Command command; public ClerkInvoker() { System.out.println("创建接待员请求者"); } public ClerkInvoker(Command command) { this.command = command; } public void call() { System.out.println("请求执行..."); command.execute(); } public Command getCommand() { return command; } }
再下面就是main方法执行了
public static void main(String[] args) { //指定接收者为厨师 Receiver receiver = new CookReceiver(); //命令为下单命令 Command command = new OrderCommand(receiver); //传递者为接待员 Invoker clerkInvoker = new ClerkInvoker(command); //接待员大叫一声,菜来了 clerkInvoker.call(); }
总结:
- 感觉这个模式跟我目前的工作场景(网站开发)不太符合,它的目的很明确,就是让命令的请求一方不知道命令到底是如何执行的,但是我认为现在已经有接口了,我们去调用某一个接口,我们也是不清楚接口中的业务逻辑的
- 个人感觉这个模式有一些死板。
参考文档:
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/creational.html
《head First设计模式》
《Java与模式》