Java设计模式-图解-附代码(3)

2019-03-29 11:23

Java设计模式(疯狂Java联盟版)

public class Singleton {

private static Singleton sing; private Singleton() { }

public static Singleton getInstance() { if (sing == null) {

sing = new Singleton(); }

return sing; } }

Test

public class Test {

public static void main(String[] args) { Singleton sing = Singleton.getInstance(); Singleton sing2 = Singleton.getInstance(); System.out.println(sing); System.out.println(sing2); } }

result

singleton.Singleton@1c78e57 singleton.Singleton@1c78e57

1.1.5 原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

适用性

1.当一个系统应该独立于它的产品创建、构成和表示时。

2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3.为了避免创建一个与产品类层次平行的工厂层次时。 4.当一个类的实例只能有几个不同状态组合中的一种时。

建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

参与者

1. Prototype

声明一个克隆自身的接口。 2. ConcretePrototype

实现一个克隆自身的操作。 3. Client

让一个原型克隆自身从而创建一个新的对象。

类图 例子 Prototype

public class Prototype implements Cloneable {

10

Java设计模式(疯狂Java联盟版)

private String name;

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

public String getName() { return this.name; }

public Object clone(){ try {

return super.clone(); } catch (Exception e) { e.printStackTrace(); return null; } } }

ConcretePrototype

public class ConcretePrototype extends Prototype { public ConcretePrototype(String name) { setName(name); } }

Client

public class Test {

public static void main(String[] args) {

Prototype pro = new ConcretePrototyte(\ Prototype pro2 = (Prototype)pro.clone(); System.out.println(pro.getName()); System.out.println(pro2.getName()); } }

result

prototype prototype

1.2 结构型模式

Adapter ( 适配器模式) Bridge ( 桥接模式 ) Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 )

11

Java设计模式(疯狂Java联盟版)

1.2.1 适配器模式

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适用性

1.你想使用一个已经存在的类,而它的接口不符合你的需求。

2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那接口 可能不一定兼容的类)协同工作。

3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行 子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

参与者

1.Target

定义Client使用的与特定领域相关的接口。 2.Client

与符合Target接口的对象协同。 3.Adaptee

定义一个已经存在的接口,这个接口需要适配。 4.Adapter

对Adaptee的接口与Target接口进行适配

类图 例子 Target

public interface Target { void adapteeMethod(); void adapterMethod(); }

Adaptee

public class Adaptee {

public void adapteeMethod() {

System.out.println(\ } }

Adapter

public class Adapter implements Target { private Adaptee adaptee;

public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } public void adapteeMethod() { adaptee.adapteeMethod(); } public void adapterMethod() { System.out.println(\ } }

12

Java设计模式(疯狂Java联盟版)

Client

public class Test {

public static void main(String[] args) {

Target target = new Adapter(new Adaptee()); target.adapteeMethod(); target.adapterMethod(); } }

result

Adaptee method! Adapter method!

1.2.2 桥接模式

将抽象部分与它实现部分分离,使它们都可以独立地变化。

适用性

1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。

例如这种情况可能是因为,在程序运行时刻实现部分应可以选择或者切换。 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。

这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。 4.正如在意图一节的第一个类图中所示的那样,有许多类要生成。 这一种类层次结构说明你必须将一个对象分解成两个部分。

5.想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

参与者

1.Abstraction

定义抽象类的接口。

维护一个指向Implementor类型对象的指针。 2.RefinedAbstraction

扩充由Abstraction定义的接口。 3.Implementor

定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。 事实上这两个接口可以完全不同。

一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。

4.ConcreteImplementor

实现Implementor接口并定义它的具体实现。

类图 例子 Abstr*ction

public abstract class Person { private Clothing clothing; private String type;

public Clothing getClothing() {

13

Java设计模式(疯狂Java联盟版)

return clothing; }

public void setClothing() {

this.clothing = ClothingFactory.getClothing(); }

public void setType(String type) { this.type = type; }

public String getType() { return this.type; }

public abstract void dress(); }

RefinedAbstraction

public class Man extends Person { public Man() {

setType(\男人\ }

public void dress() {

Clothing clothing = getClothing(); clothing.personDressCloth(this); } }

public class Lady extends Person { public Lady() {

setType(\女人\ }

public void dress() {

Clothing clothing = getClothing(); clothing.personDressCloth(this); } }

Implemento*

public abstract class Clothing {

public abstract void personDressCloth(Person person); }

ConcreteImplemento*

public class Jacket extends Clothing {

public void personDressCloth(Person person) {

System.out.println(person.getType() + \穿马甲\ } }

public class Trouser extends Clothing {

public void personDressCloth(Person person) {

System.out.println(person.getType() + \穿裤子\ }

14


Java设计模式-图解-附代码(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2009中考分类汇编-二次函数

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: