Design Pattern/设计模式: Introduction & Part VII
设计模式以及综述
设计模式对于一名软件开发工程师来说可谓是必备的技能和知识,然而在程序员社区中也充斥着不少对于设计模式的反对之音。有人认为设计模式的知识对于工程开发至关重要,但也有许多经验丰富的程序员认为设计模式应当是长期的软件开发的积累所留下的不可名状的抽象艺术,对于市面上不少介绍设计模式的书籍嗤之以鼻。
对于刚入门的软件开发工程师而言,你若问他(包括现在的我自己)“我们为什么要使用工厂模式?使用工厂模式能够带来什么好处?”之类的问题,他也是很难回答的。所以盲目的掌握设计模式中那些拗口的名称,或者干巴巴的“方便继承”之类的描述是没有意义的。
这一系列的博客的目的并不是一蹴而就的讲解全部的设计模式知识,这样的知识没有日积月累的开发经验是很难去对其有深入的体会的。我只是希望能在这一系列的博客中,借助《图解设计模式》一书,跟随书中的顺序对其中的设计模式知识进行某种程度的理解和总结,以至于能够对诸君有所启迪,开发出更加优美和友好的代码。
我的能力有限,若是文中出现什么谬误也请诸君不吝赐教,提前感谢。
《图解设计模式》一书的作者是结城浩先生,全书共计十个部分,预计会分为十篇博客进行介绍。书中的代码为java所写,虽然java并不是我比较擅长的代码,但是为了不引起错误贻笑大方,所以还是按照书中的java进行讨论。本博客介绍其中的第七部分:简单化。因为每一章节中代码都占据了比较多的部分,为了更好地理解相关概念,建议阅读代码优先从Main.java的部分开始。
Chapter 15 Facade模式–简单窗口
一个程序总是会随着时间的推移、项目周期的演进而变得愈加复杂,我们需要面对复杂的类和接口,而且令人头痛的是这些接口和类之间的关系盘根错节,导致程序的结构和调用顺序都非常令人困惑和难以理解。而为了解决这个问题,我们就可以使用Facade模式。
Facade是法语里的窗口的意思,这个模式致力于隐藏系统的复杂性,并向客户提供一个可以访问(复杂)系统的接口,这样我们就不必单独的关注系统中的每一个类了,只需简单的对Facade(接口)提出请求即可。这个Facade接口需要为相互关联在一起的错综复杂的类整理出高层接口,其中的Facade角色会考虑到系统内部各个类之间的责任关系和依赖观其,使其能够以正确的顺序调用各个类。
例:我们将创建一个Shape接口和实现了Shape接口的类,下一步是定义一个外观类(Facade)ShapeMaker。ShapeMaker类将会使用实体类来代表用户对这些类进行调用,Main使用ShapeMaker类来显示结果。
// Shape.java
public interface Shape{
void draw();
}
// Rectangle.java: (错综复杂的)类1
public class Rectangle extends Shape{
@Overrider
public void draw(){
SYstem.out.println("DRAW RECTANGLE");
}
}
// Square.java: (错综复杂的)类2
public class Square extends Shape{
@Overrider
public void draw(){
SYstem.out.println("DRAW SQUARE");
}
}
// Circle.java: (错综复杂的)类3
public class Circle extends Shape{
@Overrider
public void draw(){
SYstem.out.println("DRAW CIRCLE");
}
}
// ShapeMaker.java: 外观类/窗口类
public class ShapeMaker{
private Shape circle;
private Shape rectangle;
private Shape square;
// 这里对于Main我们隐藏了Cirle类等他们之间的关系,我们相信ShapeMaker可以提供正确的调用,而这一点对于Main来说就已经足够了
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
public void drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
}
public void drawSquare(){
square.draw();
}
}
public class Main {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
Chapter 16 Mediator模式–只有一个仲裁者
关于Mediator模式,书中形象的介绍到:就像是一个乱糟糟的开发小组协同工作,如果没有仲裁者可能就四个和尚没水喝。所以我们选一个角色成为中介者/仲裁者,所有的组员向中介者报告,中介者向组员下达指示,而组员之间不再相互询问和相互指示。
中介者模式(Mediator Pattern)用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使类之间的“网状结构”分离成为“星状结构”,更易于维护。
我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类,ChatRoom和User。User对象使用ChatRoom方法来分享他们的消息。Main类使用User对象来显示他们之间的通信。
// ChatRoom.java: 中介类
import java.util.Date;
public class ChatRoom {
public static void showMessage(User user, String message){
System.out.println(new Date().toString()
+ " [" + user.getName() +"] : " + message);
}
}
// User.java
public class User {
private String name;
public User(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sendMessage(String message){
ChatRoom.showMessage(this,message);
}
}
public class MediatorPatternDemo {
public static void main(String[] args) {
User robert = new User(“Robert”);
User john = new User(“John”);
robert.sendMessage("Hi! John!");
john.sendMessage("Hello! Robert!");
}
}