Java设计模式学习笔记 2

来源:互联网 发布:say it again frances 编辑:程序博客网 时间:2024/05/29 16:50

建造者模式和装饰模式

    • 建造者模式和装饰模式
      • 建造者模式
      • 装饰模式

建造者模式

建造者模式的(Builder),将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的标识。简单的用生产两个大小不同的零件举例

Product—零件类,由2个部件组成

public class Product {    private String partA;    private String partB;    public void setPartA(String partA){        this.partA=partA;    }    public void setPartB(String partB){        this.partB=partB;    }}

ProductBuilder接口—建造者接口,是为创建Product对象的各个部件而指定的抽象接口

public interface ProductBuilder {    void buildPartA();    void buildPartB();    Product getResult();}

Director—控制建造过程

public class Director {    public Product createProduct(ProductBuilder productBuilder){        productBuilder.buildPartA();        productBuilder.buildPartB();        return productBuilder.getResult();    }}

BigProduct—具体的建造者类,用于构造和装配各个部件

public class BigProductBuilder implements ProductBuilder {    private static final String TAG = "BigProductBuilder";    Product product =new Product();    @Override    public void buildPartA() {        Log.d(TAG, "buildPartA: big");        product.setPartA("bigA");    }    @Override    public void buildPartB() {        Log.d(TAG, "buildPartB: big");        product.setPartB("bigB");    }    @Override    public Product getResult() {        Log.d(TAG, "getResult: big");        return product;    }}

SmallProduct—具体的建造者类(代码略)

客户端代码

//创建一个大零件对象ProductBuilder builder1 =new BigProductBuilder();//创建一个小零件对象ProductBuilder builder2 =new SmallProductBuilder();//创建组装流程对象Director director=new Director();//通过组装流程对象组装大小两个零件Product big=director.createProduct(builder1);Product small=director.createProduct(builder2);

装饰模式

装饰模式,动态的给一个对象添加一些额外的职责。
与建造者模式的固定装配流程相比,装饰模式则随意得多。之前网上看到一个汉堡的例子,特别形象

Humburger—汉堡类(被装饰者基类)

public abstract class Humburger {    public String name;    public String getName() {        return name;    }    abstract double getPrice();}

ChickenBurger—鸡腿堡类(被装饰者的初始状态)

public class ChickenBurger extends Humburger {    public ChickenBurger() {        name ="鸡腿堡";    }    @Override    public double getPrice() {        return 10;    }}

Condiment —配料的基类(装饰者,用来对汉堡进行多层装饰,每层装饰增加一些配料)

public abstract class Condiment extends Humburger {    public abstract String getName();}

Lettuce—生菜(装饰者的第一层)

public class Lettuce extends Condiment {    Humburger humburger;    public Lettuce(Humburger humburger) {        this.humburger = humburger;    }    @Override    double getPrice() {        return humburger.getPrice()+1.5;    }    @Override    public String getName() {        return humburger.getName()+" 加生菜";    }}

Chilli—辣椒(装饰者的第二层)

public class Chilli extends Condiment {    Humburger humburger;    public Chilli(Humburger humburger) {        this.humburger = humburger;    }    @Override    double getPrice() {        return humburger.getPrice()+ 0.5;    }    @Override    public String getName() {        return humburger.getName() +" 加辣椒";    }}

客户端代码

Humburger humburger= new ChickenBurger();Humburger addLettuce =new Lettuce(humburger);Humburger addChilli =new Chilli(addLettuce);Log.d(TAG, "Humburger: "+addChilli.getName());结果:Humburger: 鸡腿堡 加生菜 加辣椒

通过对比不难发现,建造者模式要求建造的过程必须是稳定的。而装饰模式的过程不是稳定的。装饰模式是对于一个东西做的是表面外部的装扮,属于对一个对象的拓展,而建造者模式是对一个东西整体框架的一个组装,属于对一个对象的建造。

注:以上纯属个人观点,欢迎指正

原创粉丝点击