Java中的23种设计模式—代码

http://www.cnblogs.com/luohuarenduli/archive/2008/01/17/1042425.html

packagelq.test;

importjava.io.*;

importjava.util.*;

//*********创建型模式***************

//factorymethod1

//1具体的构造算法,和2构造出的具体产品由子类实现

interfaceProduct{

}

//或者我也提供一个工厂的接口,由这个抽象类来继承它

abstractclassFactory{

abstractpublicProductfmd();

//我认为这个方方法的存在是,是对FactoryMethod方法的补充

//例如可以为生成的对象赋值,计算为生成对象应付何值,前后的日值

//且这些都是公用的,生成产品的最主要算法还是在FactoryMethod中,

//这个方法只是起辅助作用,这也是一种思维方法,将具体的算法实现在一个方法中

//而我不直接调用此方法,而使用另外的一个方法封装它,等到了更灵活的效果,而

//子类需实现的内容是FactoryMethod

//此方法是一个TemplateMethod

publicProductcreat(){

Productpd=null;

System.out.println("beforeoperation");

pd=fmd();

System.out.println("endoperation");

returnpd;

}

}

classProduct1implementsProduct{

}

classFactory1extendsFactory{

publicProductfmd(){

Productpd=newProduct1();

returnpd;

}

}

//FactroyMethod2

//这种方式简单实用

interfaceProducta{

}

interfaceFactorya{

Productacreate();

}

classProducta1implementsProducta{}

classFactorya1implementsFactorya{

publicProductacreate(){

Productapda=null;

pda=newProducta1();

returnpda;

}

}

//AbstractFactory

//AbstractFactory与FactoryMethod的不同在于AbstractFactory创建多个产品

//感觉此模式没有什么大用

//当然可以还有更多的接口

interfaceApda{}

interfaceApdb{}

interfaceAfactory{

ApdacreateA();

ApdbcreateB();

}

classApda1implementsApda{}

classApdb1implementsApdb{}

//有几个接口就有几个对应的方法

classAfactory1implementsAfactory{

publicApdacreateA(){

Apdaapda=null;

apda=newApda1();

returnapda;

}

publicApdbcreateB(){

Apdbapdb=null;

apdb=newApdb1();

returnapdb;

}

}

//Builder

//一个产品的生成分为生成部件和组装部件,不同的产品每个部件生成的方式不同

//而组装的方式相同,部件的生成抽象成接口方法,而组装的方法使用一个TemplateMethod方法

interfaceCpda{}

classCpda1implementsCpda{}

interfaceBuilderI{

voidbuildPart1();

voidbuildPart2();

voidinitPd();

CpdagetPd();

}

abstractclassBuilderAimplementsBuilderI{

Cpdacpda;

publicCpdagetPd(){

initPd();

//对对象的内容进行设置

buildPart1();

buildPart2();

returncpda;

}

}

classBuilderextendsBuilderA{

publicvoidbuildPart1(){

System.out.println(cpda);

}

publicvoidbuildPart2(){

System.out.println(cpda);

}

publicvoidinitPd(){

cpda=newCpda1();

}

}

//一个简单的生成产品的实现

//1

abstractclassFy{

publicabstractvoidmed1();

staticclassFy1extendsFy{

publicvoidmed1(){

}

}

publicstaticFygetInstance(){

Fyfy=newFy1();

returnfy;

//Fyfy=newFy1(){//这种匿名内部类是静态的!!

}

//2

interfacePdd{}

classPdd1implementsPdd{}

abstractclassFya{

publicstaticPddgetPd(){

Pddpdd=newPdd1();

returnpdd;

}

}

//Prototype在java中就是clone,又包含深拷贝和浅拷贝

classCloneObja{

publicCloneObjaMyClone(){

returnnewCloneObja();

}

}

classCloneObjb{

publicCloneObjbMyClone()throwsThrowable{

CloneObjbcobj=null;

cobj=(CloneObjb)pcl(this);

returncobj;

}

/深度拷贝算法

privateObjectpcl(Objectobj)throwsThrowable{

ByteArrayOutputStreambao=newByteArrayOutputStream(1000);

ObjectOutputStreamobjo=newObjectOutputStream(bao);

objo.writeObject(obj);

ByteArrayInputStreambai=newByteArrayInputStream(bao.toByteArray());

ObjectInputStreamobji=newObjectInputStream(bai);

Objectobjr=obji.readObject();

returnobjr;

}

}

//Singleton

//一个类只有一个对象,例如一个线程池,一个cache

classSingleton1{

publicstaticSingleton1instance=newSingleton1();

privateSingleton1(){

}

publicstaticSingleton1getInstance(){

returninstance;

}

}

classSingleton2{

publicstaticSingleton2instance;

privateSingleton2(){

}

//publicstaticSingleton2getInstance(){

//if(instance==null){

//instance=newSingleton2();

//}

//

//returninstance;

//}

publicstaticSingleton2getInstance(){

synchronized(Singleton2.class){

if(instance==null){

instance=newSingleton2();

}

}

returninstance;

}

}

//**********结构型模式**********

//Adapter

//基本方法有两种,一种是使用引用一种使用继承

//将不符合标准的接口转成符合标准的接口,接口的修改主要是参数的增减,

//返回值类型,当然还有方法名

//感觉这就是封装的另一种表示形式,封装有用方法封装(在方法中调用功能方法),

//用类封装(先传入功能方法所在的类的对象,通过调用此对象的功能方法)

//使用引用的形式

classAdapteea{

publicvoidkk(){}

}

interfaceTargeta{

Stringvv(inti,intk);

}

classAdapteraimplementsTargeta{

Adapteeaade;

publicAdaptera(Adapteeaade){

this.ade=ade;

}

publicStringvv(inti,intk){

//具体的业务方法实现在Adaptee中,这个方法

//只起到了接口转换的作用

//调用此方法是通过引用

ade.kk();

returnnull;

}

}

//使用继承形式的

classAdapteeb{

publicvoidkk(){}

}

interfaceTargetb{

Stringvv(inti,intk);

}

classAdapterbextendsAdapteebimplementsTargetb{

publicStringvv(inti,intk){

//调用此方法是通过继承

kk();

returnnull;

}

}

//Proxy

interfaceSubject{

voidrequest();

}

classrealSubjectimplementsSubject{

publicvoidrequest(){

//dotherealbusiness

}

}

classProxyimplementsSubject{

Subjectsubject;

publicProxy(Subjectsubject){

this.subject=subject;

}

publicvoidrequest(){

System.out.println("dosomething");

subject.request();

System.out.println("dosomething");

}

}

//Bridge

//感觉就是多态的实现

interfaceImp{

voidoperation();

}

classCimp1implementsImp{

publicvoidoperation(){

System.out.println("1");

}

}

classCimp2implementsImp{

publicvoidoperation(){

System.out.println("2");

}

}

classInvoker{

Impimp=newCimp1();

publicvoidinvoke(){

imp.operation();

}

}

//Composite

interfaceComponent{

voidoperation();

voidadd(Componentcomponent);

voidremove(Componentcomponent);

}

classLeafimplementsComponent{

publicvoidoperation(){

System.out.println("anoperation");

}

publicvoidadd(Componentcomponent){

thrownewUnsupportedOperationException();

}

publicvoidremove(Componentcomponent){

thrownewUnsupportedOperationException();

}

}

classCompositeimplementsComponent{

Listcomponents=newArrayList();

publicvoidoperation(){

Componentcomponent=null;

Iteratorit=components.iterator();

while(it.hasNext()){

//不知道此component对象是leaf还是composite,

//如果是leaf则直接实现操作,如果是composite则继续递归调用

component=(Component)it.next();

component.operation();

}

}

publicvoidadd(Componentcomponent){

components.add(component);

}

publicvoidremove(Componentcomponent){

components.remove(component);

}

}

//Decorator

//对一个类的功能进行扩展时,我可以使用继承,但是不够灵活,所以选用了

//另外的一种形式,引用与继承都可活得对对象的一定的使用能力,而使用引用将更灵活

//我们要保证是对原功能的追加而不是修改,否则只能重写方法,或使用新的方法

//注意concrete的可以直接new出来,

//而decorator的则需要用一个另外的decorator对象才能生成对象

//使用对象封装,和公用接口

//Decorator链上可以有多个元素

interfaceComponenta{

voidoperation();

}

classConcreteComponentimplementsComponenta{

publicvoidoperation(){

System.out.println("dosomething");

}

}

classDecoratorimplementsComponenta{

privateComponentacomponent;

publicDecorator(Componentacomponent){

this.component=component;

}

publicvoidoperation(){

//dosomethingbefore

component.operation();

//dosomethingafter

}

}

//Facade

//非常实用的一种设计模式,我可以为外部提供感兴趣的接口

classObj1{

publicvoidope1(){}

publicvoidope2(){}

}

classObj2{

publicvoidope1(){}

publicvoidope2(){}

}

classFacade{

//我得到了一个简洁清晰的接口

publicvoidfdMethod(){

Obj1obj1=newObj1();

Obj2obj2=newObj2();

obj1.ope1();

obj2.ope2();

}

}

//Flyweight

//空

//**********行为型模式*************

//ChainofResponsibility

//与Decorator的实现形式相类似,

//Decorator是在原来的方法之上进行添加功能,而

//Chain则是判断信号如果不是当前处理的则转交个下一个节点处理

//我可以使用if分支来实现相同的效果,但是不够灵活,链上的每个节点是可以替换增加的,相对

//比较灵活,我们可以设计接口实现对节点的增删操作,而实现更方便的效果

//这个是一个链状的结构,有没有想过使用环状结构

interfaceHandler{

voidhandRequest(intsignal);

}

classCHandler1implementsHandler{

privateHandlerhandler;

publicCHandler1(Handlerhandler){

this.handler=handler;

}

publicvoidhandRequest(intsignal){

if(signal==1){

System.out.println("handlesignal1");

}

else{

handler.handRequest(signal);

}

}

}

classCHandler2implementsHandler{

privateHandlerhandler;

publicCHandler2(Handlerhandler){

this.handler=handler;

}

publicvoidhandRequest(intsignal){

if(signal==2){

System.out.println("handlesignal2");

}

else{

handler.handRequest(signal);

}

}

}

classCHandler3implementsHandler{

publicvoidhandRequest(intsignal){

if(signal==3){

System.out.println("handlesignal3");

}

else{

thrownewError("can'thandlesignal");

}

}

}

classChainClient{

publicstaticvoidmain(String[]args){

Handlerh3=newCHandler3();

Handlerh2=newCHandler2(h3);

Handlerh1=newCHandler1(h2);

h1.handRequest(2);

}

}

//Interpreter

//感觉跟Composite很类似,只不过他分文终结符和非终结符

//TemplateMethod

abstractclassTemplateMethod{

abstractvoidamd1();

abstractvoidamd2();

//此方法为一个TemplateMethod方法

publicvoidtmd(){

amd1();

amd2();

}

}

//publicvoidmed1(){

//}

//};

//returnfy

}