23种设计模式

此笔记从B站狂神说Java 获取

什么是设计模式

在这里插入图片描述

学习设计模式的意义

在这里插入图片描述

GoF23

在这里插入图片描述

oop七大原则

(1)开闭原则: 一个软件的实体应当对扩展开放,对修改关闭;

(2)里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立

(3)依赖倒置原则:要面向接口编程,不要面向实现编程。

(4)单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性。

(5)接口隔离原则:要为各个类建立它们需要的专用接口

(6)迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话。

(7)合成复用原则:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

工厂模式

1、作用:实现创建者和调用者分离

2、00P七大原则:

(1)开闭原则: 一个软件的实体应当对扩展开放,对修改关闭;

(2)依赖倒转原则:要针对接口编程,不要针对实现编程;

(3)迪米特法则:只与你直接的朋友通信,而避免和陌生人通信;

3、核心本质:

(1)实例化对象不使用new, 用工厂方法代替

(2)将选择实现类, 创建对象统一管理和控制。 从而将调用者跟我们的实现类解耦。

在这里插入图片描述

简单工厂模式

1.Car接口

package com.etc.factory.simple;

public interface Car {
    void name();
}

2.车 WuLing

package com.etc.factory.simple;

public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱");
    }
}

3.车 Tesla

package com.etc.factory.simple;

public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

4.CarFactory (创建工厂)

package com.etc.factory.simple;
//简单工厂模式 静态工厂模式
//开闭原则
public class CarFactory {
    //方法一
    public static Car getCar(String car) {
        //如果添加其他类,需要修改下列代码,修改逻辑
        if (car.equals("五菱")) {
            return new WuLing();
        }else if (car.equals("特斯拉")) {
            return new Tesla();
        }else {
            return null;
        }
    }

    //出现问题 增加一个车呢?
    //方法二   不修改原逻辑的情况下
    public static Car getwuling() {
        return new WuLing();
    }
    public static Car getTesla() {
        return new Tesla();
    }
}

5.Consumer

package com.etc.factory.simple;

public class Consumer {
    public static void main(String[] args) {
        // 1 常规创建
//        Car car1=new WuLing();
//        Car car2=new Tesla();

        // 2 使用工厂创建
        Car car1 = CarFactory.getCar("五菱");
        Car car2 = CarFactory.getCar("特斯拉");
        car1.name();
        car2.name();

    }
}

工厂方法模式

1.car接口

package com.etc.factory.method;

public interface Car {
    void name();
}

2.CarFactory接口

package com.etc.factory.method;
//工厂方法模式
public interface CarFactory {
    Car getCar();
}

3.车 WuLing

package com.etc.factory.simple;

public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱");
    }
}

4.给五菱单独创建个工厂 WuLingFactory

package com.etc.factory.method;

public class WuLingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

5.车 Tesla

package com.etc.factory.simple;

public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

6.给Tesla单独创建个工厂 TeslaFactory

package com.etc.factory.method;

public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

7.Consumer

package com.etc.factory.method;


public class Consumer {
    public static void main(String[] args) {

        Car car1 = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();

        car1.name();
        car2.name();
    }
}

结构复杂度: simple

代码复杂度: simple

编程复杂度: simple

管理上的复杂度: simple

根据设计原则:工厂方法模式!

根据实际业务:简单工厂模式!

图片解释

在这里插入图片描述

在这里插入图片描述

抽象工厂模式

在这里插入图片描述

在这里插入图片描述

代码演示

1.IPhoneProduct接口

//手机产品接口
public interface IPhoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendMS();
}

2.IRouteProduct接口

//路由器产品接口
public interface IRouteProduct {
    void start();
    void shutdown();
    void openWife();
    void setting();
}

3.小米手机

package com.etc.factory.abstract1;

public class XiaomiPhone implements IPhoneProduct {
    @Override
    public void start() {
        System.out.println("开启小米手机");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭小米手机");
    }

    @Override
    public void callup() {
        System.out.println("小米打电话");
    }

    @Override
    public void sendMS() {
        System.out.println("小米发短信");
    }
}

4.小米路由器

package com.etc.factory.abstract1;

public class XiaomiRouter implements IRouteProduct{
    @Override
    public void start() {
        System.out.println("启动小米路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭小米路由器");
    }

    @Override
    public void openWife() {
        System.out.println("开启小米wifi");

    }

    @Override
    public void setting() {
        System.out.println("设置小米路由器");
    }
}

5.华为手机

package com.etc.factory.abstract1;

public class HuaweiPhone implements IPhoneProduct {
    @Override
    public void start() {
        System.out.println("开启华为手机");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭华为手机");
    }

    @Override
    public void callup() {
        System.out.println("华为打电话");
    }

    @Override
    public void sendMS() {
        System.out.println("华为发短信");
    }
}

6.华为路由器

package com.etc.factory.abstract1;

public class HuaweiRouter implements IRouteProduct{
    @Override
    public void start() {
        System.out.println("启动华为路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭华为路由器");
    }

    @Override
    public void openWife() {
        System.out.println("开启华为wifi");

    }

    @Override
    public void setting() {
        System.out.println("设置华为路由器");
    }
}

7.抽象工厂

package com.etc.factory.abstract1;
//抽象产品工厂
public interface IProductFactory {
    //生产手机
    IPhoneProduct iphoneProduct();
    //生产路由器
    IRouteProduct routeProduct();
}

8.小米工厂

package com.etc.factory.abstract1;

public class XiaomiFactory implements IProductFactory{
    @Override
    public IPhoneProduct iphoneProduct() {
        return new XiaomiPhone();
    }

    @Override
    public IRouteProduct routeProduct() {
        return new XiaomiRouter();
    }
}

9.华为工厂

package com.etc.factory.abstract1;

public class HuaweiFactory implements IProductFactory{
    @Override
    public IPhoneProduct iphoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public IRouteProduct routeProduct() {
        return new HuaweiRouter();
    }
}

10.客户端使用

package com.etc.factory.abstract1;

public class Client {
    public static void main(String[] args) {
        System.out.println("=======小米系列产品=========");
        XiaomiFactory xiaomiFactory = new XiaomiFactory();

        IPhoneProduct iPhoneProduct = xiaomiFactory.iphoneProduct();
        iPhoneProduct.callup();
        iPhoneProduct.sendMS();

        IRouteProduct iRouteProduct = xiaomiFactory.routeProduct();
        iRouteProduct.openWife();

        System.out.println("=======华为系列产品=========");
        HuaweiFactory huaweiFactory = new HuaweiFactory();

        iPhoneProduct = huaweiFactory.iphoneProduct();
        iPhoneProduct.callup();
        iPhoneProduct.sendMS();

        iRouteProduct = huaweiFactory.routeProduct();
        iRouteProduct.openWife();
    }
}

建造者模式

在这里插入图片描述

在这里插入图片描述

代码演示

1.抽象的建造者

package com.etc.factory.builder;
//抽象的建造者 : 方法
public abstract class Builder {
    abstract void buildA();//地基
    abstract void buildB();//钢筋工程
    abstract void buildC();//铺电线
    abstract void buildD();//粉刷

    //完工 :得到产品
    abstract Product getProduct();
}

2.产品: 房子

package com.etc.factory.builder;
//产品: 房子
public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;

    public String getBuildA() {
        return buildA;
    }

    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }

    public String getBuildB() {
        return buildB;
    }

    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }

    public String getBuildC() {
        return buildC;
    }

    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }

    public String getBuildD() {
        return buildD;
    }

    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }

    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

3.具体的建造者

package com.etc.factory.builder;
//具体的建造者 : 工人
public class Worker extends Builder {
    private Product product;

    public Worker(){
        product=new Product();
    }
    @Override
    void buildA() {
        product.setBuildA("地基");
        System.out.println("地基");
    }

    @Override
    void buildB() {
        product.setBuildB("钢筋工程");
        System.out.println("钢筋工程");
    }

    @Override
    void buildC() {
        product.setBuildB("铺电线");
        System.out.println("铺电线");
    }

    @Override
    void buildD() {
        product.setBuildB("粉刷");
        System.out.println("粉刷");
    }

    @Override
    Product getProduct() {
        return product;
    }
}

4.指挥者

package com.etc.factory.builder;
//指挥 :核心 负责指挥构建一个工程,工程如何构建,由它决定
public class Director {

    //指挥工人按照顺序建房子
    public Product build(Builder builder){
        builder.buildA();
        builder.buildB();
        builder.buildC();
        builder.buildD();
        return builder.getProduct();
    }
}

5.测试

package com.etc.factory.builder;

public class Test {
    public static void main(String[] args) {
        //指挥
        Director director = new Director();
        //指挥 具体的工人完成  产品
        Product build = director.build(new Worker());
        //顺序由工人决定
        System.out.println(build.toString());
    }
}

代码再理解

1.建造者

package com.etc.factory.builder2;
//建造者
public abstract class Builder {
    abstract Builder buildA(String msg);//汉堡
    abstract Builder buildB(String msg);//可乐
    abstract Builder buildC(String msg);//薯条
    abstract Builder buildD(String msg);//甜点

    abstract Product getProduct();


}

2.产品

package com.etc.factory.builder2;
//产品 : 套餐
public class Product {
    private String BuildA="汉堡";
    private String BuildB="可乐";
    private String BuildC="薯条";
    private String BuildD="甜点";

    public String getBuildA() {
        return BuildA;
    }

    public void setBuildA(String buildA) {
        BuildA = buildA;
    }

    public String getBuildB() {
        return BuildB;
    }

    public void setBuildB(String buildB) {
        BuildB = buildB;
    }

    public String getBuildC() {
        return BuildC;
    }

    public void setBuildC(String buildC) {
        BuildC = buildC;
    }

    public String getBuildD() {
        return BuildD;
    }

    public void setBuildD(String buildD) {
        BuildD = buildD;
    }

    @Override
    public String toString() {
        return "Product{" +
                "BuildA='" + BuildA + '\'' +
                ", BuildB='" + BuildB + '\'' +
                ", BuildC='" + BuildC + '\'' +
                ", BuildD='" + BuildD + '\'' +
                '}';
    }
}

3.具体的建造者

package com.etc.factory.builder2;
//具体的建造者
public class Worker extends Builder{

    private Product product;

    public Worker(){
        product=new Product();
    }
    @Override
    Builder buildA(String msg) {
        product.setBuildA(msg);
        return this;
    }

    @Override
    Builder buildB(String msg) {
        product.setBuildB(msg);
        return this;
    }

    @Override
    Builder buildC(String msg) {
        product.setBuildC(msg);
        return this;
    }

    @Override
    Builder buildD(String msg) {
        product.setBuildD(msg);
        return this;
    }

    @Override
    Product getProduct() {
        return product;
    }

}

4.测试

package com.etc.factory.builder2;

public class Test {
    public static void main(String[] args) {
        //服务员
        Worker worker = new Worker();
         //链式编程 : 在原来的基础上,可以自由组合了,如果不组合,也有默认的套餐
        Product product = worker.buildA("全家桶")
                .buildB("雪碧").getProduct();

        System.out.println(product.toString());
        //Product{BuildA='全家桶', BuildB='雪碧', BuildC='薯条', BuildD='甜点'}
    }
}

原型模式

代码演示 demo01

1.Video

package com.etc.prototype.demo01;

import java.util.Date;

/**
 * 1.实现一个接口 Cloneable
 * 2.重写一个方法 clone()
 */
public class Video implements Cloneable{

    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

2.Bilibili

package com.etc.prototype.demo01;

import java.util.Date;

/**
 * 客户端 : 克隆
 */
public class Bilibili {
    public static void main(String[] args) throws CloneNotSupportedException {
        //原型对象 v1
        Date date = new Date();
        Video v1 = new Video("狂神说java", date);
        Video v2 = (Video) v1.clone();
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);
        System.out.println("=======");
        date.setTime(21312231); //没有发生改变
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);
        /*
        v1=>Video{name='狂神说java', createTime=Sat Feb 19 14:39:15 CST 2022}
v2=>Video{name='狂神说java', createTime=Sat Feb 19 14:39:15 CST 2022}
=======
v1=>Video{name='狂神说java', createTime=Thu Jan 01 13:55:12 CST 1970}
v2=>Video{name='狂神说java', createTime=Thu Jan 01 13:55:12 CST 1970}
         */
  }
}
/*
        //v1 克隆 v2
//        Video v2 = new Video("狂神说java", date);
        Video v2 = (Video) v1.clone();
        System.out.println("v2=>"+v2);
        System.out.println("v2=>hash:"+v2.hashCode());

* v1=>Video{name='狂神说java', createTime=Sat Feb 19 14:33:53 CST 2022}
v1=>hash:1028214719
v2=>Video{name='狂神说java', createTime=Sat Feb 19 14:33:53 CST 2022}
v2=>hash:500977346

                 v2.setName("Clone:狂神说java");
                System.out.println("v2=>"+v2);
                //v2=>Video{name='Clone:狂神说java', createTime=Sat Feb 19 14:34:49 CST 2022}

                */

在这里插入图片描述

代码演示 demo02 深克隆

1.Video

package com.etc.prototype.demo02;

import java.util.Date;

public class Video implements Cloneable{

    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        //实现深克隆~
        Video v = (Video) obj;
        v.createTime = (Date) this.createTime.clone();//将这个对象的属性也进行克隆~
        return obj;
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

2.Bilibili

package com.etc.prototype.demo02;

import java.util.Date;
//原型模式+工厂模式  ==》new 《=》 原型模式
public class Bilibili {
    public static void main(String[] args) throws CloneNotSupportedException {
        //原型对象 v1
        Date date = new Date();
        Video v1 = new Video("狂神说java", date);
        Video v2 = (Video) v1.clone();
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);
        System.out.println("=======");
        date.setTime(21312231);
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);
/*
v1=>Video{name='狂神说java', createTime=Sat Feb 19 14:43:22 CST 2022}
v2=>Video{name='狂神说java', createTime=Sat Feb 19 14:43:22 CST 2022}
=======
v1=>Video{name='狂神说java', createTime=Thu Jan 01 13:55:12 CST 1970}
v2=>Video{name='狂神说java', createTime=Sat Feb 19 14:43:22 CST 2022}
  */
  }
}

适配器模式

在这里插入图片描述

在这里插入图片描述

代码演示

1.Adaptee

package com.etc.adapter;
//要被适配的类 : 网线
public class Adaptee {
    public void request(){
        System.out.println("连接网线上网");
    }
}

2.NetToUsb

package com.etc.adapter;
//接口转换器的抽象实现
public interface NetToUsb {
    //作用: 处理请求 网线=》usb
    public void handleRequest();
}

3.Adapter

package com.etc.adapter;
//真正的适配器 需要连接USB,连接网线

//继承 (类适配器 单继承)
//组合 (对象适配器:常用)
public class Adapter extends Adaptee implements NetToUsb{

    @Override
    public void handleRequest() {
        super.request();//可以上网了
    }
}

4.Computer

package com.etc.adapter;
//客户端类:想上网  插不上网线
public class Computer {
    //我们的电脑需要连接上转接器才可以上网
    public void net(NetToUsb netToUsb){
        //上网的具体实现~ 找一个转接头
        netToUsb.handleRequest();

    }

    public static void main(String[] args) {
        //电脑 适配器 网线
        Computer computer = new Computer();
        Adaptee adaptee = new Adaptee();
        Adapter adapter = new Adapter();
        Adapter2 adapter2=new Adapter2(adaptee);

       // computer.net(adapter);
        computer.net(adapter2);
    }
}

升级版 Adapter2

package com.etc.adapter;
//真正的适配器 需要连接USB,连接网线

//继承 (类适配器 单继承)
//组合 (对象适配器:常用)
public class Adapter2  implements NetToUsb{
    private Adaptee adaptee;

    public Adapter2(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void handleRequest() {
        adaptee.request();
    }
}

桥接模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码演示

1.Brand

package com.etc.bridge;
//品牌
public interface Brand {
    void info();
}

2.Lenovo联想品牌

package com.etc.bridge;
//联想品牌
public class Lenovo implements Brand{
    @Override
    public void info() {
        System.out.print("联想");
    }
}

3.苹果品牌

package com.etc.bridge;
//苹果品牌
public class Apple implements Brand{

    @Override
    public void info() {
        System.out.print("苹果");
    }
}

4.组合

package com.etc.bridge;
//抽象的电脑类型类
public abstract class Computer {
    //组合 品牌
    protected Brand brand;

    public Computer(Brand brand) {
        this.brand = brand;
    }

    public  void info(){
        brand.info();//自带品牌
    }
}
class Desktop extends Computer{

    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public void info() {
        super.info();
        System.out.print("台式机");
    }
}

class Laptop extends Computer{

    public Laptop(Brand brand) {
        super(brand);
    }

    @Override
    public void info() {
        super.info();
        System.out.print("笔记本");
    }
}

5.测试

package com.etc.bridge;

public class Test {
    public static void main(String[] args) {
        //苹果笔记本
        Computer computer = new Laptop(new Apple());
        computer.info();
        System.out.println();
        //联想台式机
        Computer computer2 = new Desktop(new Lenovo());
        computer2.info();
    }
}

  • 12
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用Abstract Factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 Window和WindowImp 37 2.6.4 Bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 Command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 Command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 Iterator类及其子类 46 2.8.4 Iterator模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 Visitor 类及其子类 51 2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 模式 171 5.5 MEDIATOR(中介者)—对象行为型 模式 181 5.6 MEMENTO(备忘录)—对象行为型 模式 188 5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第6章 结论 232 6.1 设计模式将带来什么 232 6.2 一套通用的设计词汇 232 6.3 书写文档和学习的辅助手段 232 6.4 现有方法的一种补充 233 6.5 重构的目标 233 6.6 本书简史 234 6.7 模式界 235 6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值