设计模式说明

Produce by Shjy.Nicholas      

E-Mail: shjy.nicholas@gmail.com

Version: 1.0                   

 

说明 :

本文是 << 设计模式 -- 可复用面向对象软件的基础 >>, 英文名称 "Design Patterns -- Elements of Reusable Object-Oriented Software"

一书的复习资料 . 原书的作者是 : Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

                     译者是 : 李英军 , 马晓星 , 蔡敏 , 刘建中 .

文中所表示的页码也是中文版的页码数 .

 

. OMT 表示法的简单实例

类名

操作

数据

1.

 

 

 

 


  
public class Name {            // Name
为类名

      private String data ;          // data 为数据

      public void operation() {}        // operation() 为操作

}

 

2. 实例化

对象

--->

   Java , 就是 new 操作 , 此时会使对象内部的数据分配存储空间 .

 

3. 继承关系

     

   public class ParentClass {

      public void sayHello() {

        System.out.println(“Hello in ParentClass”) ;

}

   }

 

   public class SubClass extends ParentClass {

      public void sayHi() {

        System.out.println(“Hi in SubClass”) ;

      }

 

      public static void main(String [] args) {

        SubClass sc = new SubClass() ;

        sc.sayHello() ;

        sc.sayHi() ;

}

   }

 

/**

 * 运行结果 :

 * Hello in ParentClass     // 子类继承了父类中的方法 SayHello()

* Hi in SubClass

 */

 

 

4. 抽象类与具体类

abstract class AbstractClass {

   public abstract void operation() ;

}

 

class ConcreteSubClass extends AbstractClass {

   public void operation() {

      System.out.println("operation...") ;

   }

}

 

5. 混入类

java 中不直接支持多继承 , 可以通过 implements 多个接口来实现 .

interface ExistingInterface {

   void existingOperation() ;

}

 

interface Mixin {

   void mixinOperation() ;

}

 

class AugmentedClass implements ExistingInterface, Mixin {

   public void existingOperation() {

      System.out.println("existingOperation()") ;

   }

  

   public void mixinOperation() {

      System.out.println("mixinOperation()") ;

   }

}

 

 

. 委托

class Rectangle {

   public int width ;

   public int height ;

  

   public int area(){

      return width * height ;

   }

}

 

class Window {

   Rectangle rectangle = new Rectangle() ;

  

   public int area() {

      return rectangle.area() ;

   }

}

 

. Lexi 说明 .

1. 设计中涉及到 7 种设计模式 , 分别是 Abstract Factory, Composite, Strategy, Decorator, Bridge, Command, Iterator.

 

2. 设计问题 :

u      文档结构 :Lexi 的用户可以直接操纵行 , , 图形 , 表等子结构 .

使用到的模式 : 组合模式 .

u      格式化 : 将一个图元集合分解为若干行 .

格式化不同于表示 ,Lexi 必须将文本分解成行 , 将行分解成列等操作 , 同时还要满足用户的高层次要求 , : 指定边界宽度 , 缩进大小和表格形式 , 是否隔行显示以及其他可能的许多格式限制条件 .

使用的模式 : 策略模式 .

u      修饰用户界面 :

支持两种修饰 :

n        在文本编辑区域周围加边界以界定文本页 .

n        加滚动条 .

   使用的模式 : 装饰模式 .

u      支持多种视感标准 : 支持多种视感标准 , 以满足平台移植的要求 .

使用模式 : 抽象工厂 .

u      支持多种窗口系统 : 解决移植中的窗口环境 .

使用模式 : 桥接模式 .

u      用户操作 : 通过文档的 WYSIWYG( 所见即所得 ) 得到 , 并支持撤销和重做功能 , 以及命令历史记录 .

使用得模式 : 命令模式 .

u      拼写检查和连字符 :

1. 访问以图元形式存在的 , 分散在文档结构中的信息 .

2. 分析这些信息

使用的模式 : 迭代器模式 .

. 重要模式的说明 :


1. Abstract Factory
抽象工厂模式

   
   抽象工厂模式涉及到以下角色 :

u      抽象工厂角色 : 担任这个角色的是工厂方法模式的核心 , 它是与应用系统的商业逻辑无关的 .

u      具体工厂角色 : 这个角色直接在客户端的调用下创建产品的实例 .

u      抽象产品角色 : 担任这个角色的类是工厂方法模式所创建的对象的父类 , 或它们共同拥有的接口 .

u      具体产品角色 : 抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例 .


在书
P58 页的结构图中 ,

抽象工厂角色 :AbstractFactory

具体工厂角色 :ConcreteFactory1, ConcreteFactory2

抽象产品角色 :AbstractProductA, AbstractProductB

具体产品角色 :ProductA1, ProductA2, ProductB1, ProductB2

 

2. Builder 生成器模式


Builder
涉及到的角色 : ( 括号内为所举例子中所对应的类名 )

u      抽象创造者 (Builder)

u      具体创造者 (ConcreteBuilder)

u      导演者 (Director)

u      产品 (Product)


举例说明
:

abstract public class Builder {

public abstract void buildPart1();

public abstract void buildPart2();

 

public abstract Product retrieveResult();

}

 

public class ConcreteBuilder extends Builder {

private Product product = new Product() ;

 

public void buildPart1() {

   product.setPart1(“Part1 be build”) ;

}

 

public void buildPart2() {

   product.setPart2(“Part2 be build”) ;

}

 

public Product retrieveResult(){

      return product;

}

}

 

public class Director {

private Builder builder;

 

public Director(Builder builder) {

this.builder = builder;

}

 

public Product construct()

builder.buildPart1();

builder.buildPart2();

return builder.retrieveResult();

}

}

 

public class Product {

   private String part1 = null ;

   private String part2 = null ;

 

public Product() {}

 

   public void setPart1(String part1){

      this.part1 = part1 ;

   }

 

   public String getPart1() {

      return this.part1 ;

   }

 

   public void setPart2(String part2){

      this.part2 = part2 ;

   }

 

   public String getPart2() {

      return this.part2 ;

   }

  

   public String toString(){

      System.out.println(“part1: ” + this.getPart1()) ;

      System.out.println(“part2: ” + this.getPart2()) ;

   }

}

 

public class Client {

private Director director = null ;

   private Builder builder = null ;

 

public void doBuild() {

      director = new Director(new ConcreteBuilder());

      System.out.println(director. construct()) ;

}

}

 

 

3. Composite 合成模式


涉及到的角色
:

u      抽象构件 (Component)

u      树叶构件 (Leaf)

u      树枝构件 (Conmposite)

 

举例 :

public interface Component {

Composite getComposite();

 

void sampleOperation();

}

 

public class Leaf implements Component {

public Composite getComposite(){

return null;

}

 

public void sampleOperation(){

System.out.println("leaf say hello") ;

}

}

 

 

import java.util.Vector;

import java.util.Enumeration;

 

public class Composite implements Component{

   private Vector componentVector = new java.util.Vector();

 

public Composite getComposite(){

return this;

}

 

public void add(Component component){

componentVector.addElement(component);

}

 

public void remove(Component component){

componentVector.removeElement(component);

}

 

public Enumeration components(){

return componentVector.elements();

}

 

   public void sampleOperation(){

Enumeration enumeration = components();

while (enumeration.hasMoreElements()){

((Component)enumeration.nextElement())

.sampleOperation();

}

}

}

 

 

4 Strategy 策略模式


对应于
P209 的结构图 ,


public class Context{

   private Strategy strategy;

 

   public Strategy setStrategy(Strategy strategy) {

      this.strategy = strategy ;

   }

  

public void contextInterface(){

this.strategy.strategyInterface();

}

}

 

 

abstract public class Strategy{

public abstract void algorithmInterface();

}

 

public class ConcreteStrategyA extends Strategy{

public void algorithmInterface(){

System.out.println("A") ;

}

}

 

public class ConcreteStrategyB extends Strategy{

public void algorithmInterface(){

System.out.println("B") ;

}

}

 

public class ConcreteStrategyC extends Strategy{

public void algorithmInterface(){

System.out.println("C") ;

}

}

 

 

5.Decorator 装饰模式


基于
P116 的结构图 , 有如下代码 :


public interface Component{

   void operation();

}

 

public class ConcreteComponent implements Component{

    public void operation(){

      // 给对象添加一些指责

   }

}

 

public class Decorator implements Component{

   private Component component = null ;

  

   public Decorator(Component component){

      this.component = component;

   }

 

public void operation(){

      component.operation();

   }

}

 

public class ConcreteDecorator extends Decorator{

    public void operation(){

      super.operation();

// 调用 Component 对象的 operation 方法 , 来给组件添加指责

   }

}

 

6.Bridge 桥接模式


基于
P101 的结构图 :


abstract public class Abstraction{

   private Implementor imp;

  

   public void operation(){

      imp.operationImp();

   }

}

 

public class RefinedAbstraction extends Abstraction{

   public void operation() {

      super.operation() ;

      // 可以增加进一步的处理

   }

}

 

abstract public class Implementor{

   public abstract void operationImp();

}

 

public class ConcreteImplementorA extends Implementor{

   public void operationImp(){

      System.out.println(

"Do something in ConcreteImplementorA ...");

   }

}

 

public class ConcreteImplementorB extends Implementor{

   public void operationImp() {

      System.out.println(

"Do something in ConcreteImplementorB ...");

   }

}

 

 

7.Command 命令模式


基于
P157, 有如下示例 :


public class Receiver {

   public Receiver() {}

 

   public void action() {

      System.out.println("Action has been taken.");

   }

}

 

public interface Command {

   void execute();

}

 

public class ConcreteCommand implements Command{

   private Receiver receiver;

  

public ConcreteCommand(Receiver receiver) {

      this.receiver = receiver;

   }

 

   public void execute() {

      receiver.action();

   }

}

 

public class Invoker {

   private Command command;

 

   public Invoker(Command command){

      this.command = command;

   }

 

   public void action() {

      command.execute();

   }

}

 

public class Client {

   public static void main(String [] args) {

      Receiver receiver = new Receiver();

      // 关键 : 将接受者绑定到一个动作

      Command command = new ConcreteCommand(receiver);

      Invoker invoker = new Invoker( command );

 

      invoker.action();

   }

}

 

 

8. Iterator 迭代器模式


基于
P172, 有如下代码 :


public interface Iterator{

   void first();

   void next();

   boolean isDone();

   Object currentItem();

}

 

public class ConcreteIterator implements Iterator{

   private ConcreteAggregate agg;

   private int index = 0;

   private int size = 0;

 

   public ConcreteIterator(ConcreteAggregate agg) {

      this.agg = agg;

      size = agg.size();

      index = 0 ;

   }

 

   public void first() {

      index = 0 ;

   }

 

   public void next(){

      if (index < size){

        index++;

      }

   }

 

   public boolean isDone() {

      return (index >= size);

   }

 

   public Object currentItem() {

      return agg.getElement(index);

   }

}

 

abstract public class Aggregate{

   public Iterator createIterator() {

      return null;

   }

}

 

public class ConcreteAggregate extends Aggregate{

 

   private Object objs[]= {" Item1 ",

                           " Item2 ",

                           " Item3 ",

                           "Item4 "
                           "Item5"};

 

   public Iterator createIterator(){

      return new ConcreteIterator(this);

   }

 

   public Object getElement(int index) {

      if (index < objs.length) {

        return objs[index];

      } else {

        return null;

      }

   }

 

   public int size(){

      return objs.length;

   }

}

 

public class Client{

   private Iterator it;

   private Aggregate agg = new ConcreteAggregate();

 

   public void operation(){

      it = agg.createIterator();

 

      while( !it.isDone() ){

        System.out.println(it.currentItem().toString());

        it.next();

      }

   }

 

   public static void main(String[] args) {

      Client client = new Client();

      client.operation();

   }

}