0%

适配者模式(多功能转换插头)

适配者模式基本介绍

  • 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表 示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同 工作。其别名为包装器(Wrapper)
  • 适配器模式属于结构型模式
  • 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
阅读全文 »

盖房项目需求

1) 需要建房子:这一过程为打桩、砌墙、封顶
2) 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不尽相同的.
3) 请编写程序,完成需求.

传统方式解决盖房需求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class AbstractHouse {

//打地基
public abstract void buildBasic();
//砌墙
public abstract void buildWalls();
//封顶
public abstract void roofed();

public void build() {
buildBasic();
buildWalls();
roofed();
}
}
阅读全文 »

观察者模式

天气预报项目需求

天气预报项目需求,具体要求如下:

1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。
2) 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
3) 提供温度、气压和湿度的接口。
4) 测量数据更新时,要能实时的通知给第三方。

阅读全文 »

桥接模式

手机操作问题

现在对不同手机类型的 不同品牌实现操作编程(比如: 开机、关机、上网,打电话等)。

传统方案解决手机操作问题

notes

传统方案解决手机操作问题分析

  • 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品 牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
  • 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这 样增加了代码维护成本。
  • 解决方案:使用桥接模式。
阅读全文 »

外观模式

影院管理项目

组建一个家庭影院: DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:

  • 直接用遥控器:统筹各设备开关
  • 开爆米花机
  • 放下屏幕
  • 开投影仪
  • 开音响
  • 开DVD,选dvd
  • 去拿爆米花
  • 调暗灯光
  • 播放
  • 观影结束后,关闭各种设备

传统方式解决影院管理

notes

传统方式解决影院管理问题分析

阅读全文 »

策略模式

编写鸭子项目,具体要求如下:

1) 有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等)
2) 显示鸭子的信息

传统方案解决鸭子问题

notes

传统的方式实现的问题分析和解决方案

1) 其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的
2) 上面说的1 的问题,其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应
3) 为了改进1问题,我们可以通过覆盖fly 方法来解决 => 覆盖解决
4) 问题又来了,如果我们有一个玩具鸭子ToyDuck, 这样就需要ToyDuck去覆盖Duck 的所有实现的方法 => 解决思路 策略模式 (strategy pattern)

阅读全文 »

装饰者模式

星巴克咖啡订单项目

咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式 咖啡)、Decaf(无因咖啡)

调料:Milk、Soy(豆浆)、Chocolate

要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便

使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖 啡+调料组合。

阅读全文 »

模板方法模式

编写制作豆浆的程序,说明如下:

1) 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎
2) 通过添加不同的配料,可以制作出不同口味的豆浆
3) 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
4) 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就 想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 )

阅读全文 »

单例模式

采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。

饿汉式(静态常量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class SingletonTest01 {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1==instance2);
System.out.println("instance1.hashCode()=" + instance1.hashCode());
System.out.println("instance2.hashCode()=" + instance2.hashCode());
}

static class Singleton{
//1.构造器私有化,防止外部new
private Singleton(){

}
//2.本类内部创建对象实例
private final static Singleton instance = new Singleton();

//3.提供一个公共的静态方法,返回实例对象
public static Singleton getInstance(){
return instance;
}
}
}
阅读全文 »

原型模式

克隆羊问题

现有一只羊tom,姓名为:tom,年龄为:1,颜色为:白色。请编写程序创建和tom羊属性完全相同的10只羊。

传统解决方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package prototype;
public class Sheep {
private String name;
private int age;
private String color;

public Sheep(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}
}
阅读全文 »