23种设计模式的代码版(Java)
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(){//这种匿名内部类是静态的!!
//publicvoidmed1(){
//}
//};
//returnfy
}
}
//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;
}
}
落花人独立
关注-0
粉丝-0
关注博主
0 0(请您对文章做出评价)
«上一篇:常用的40个网站制作技巧(转)
»下一篇:状态对象:数据库的替代者
feedback
#1楼[楼主]回复引用查看
2008-01-1710:07by落花人独立
//**********结构型模式**********
//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
//空
#2楼[楼主]回复引用查看
2008-01-1710:11by落花人独立
//**********行为型模式*************
//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();
}
}
//state
//标准型
//状态和操作不应该耦合在一起
classcontexta{
privatestatest;
publiccontexta(intnst){
changestfromnum(nst);
}
publicvoidchangestfromnum(intnst){
if(nst==1){
st=newcstatea1();
}
elseif(nst==2){
st=newcstatea2();
}
thrownewerror("badstate");
}
voidrequest(){
st.handle(this);
}
}
interfacestate{
voidhandle(contextacontext);
}
classcstatea1implementsstate{
publicvoidhandle(contextacontext){
system.out.println("state1");
//也许在一个状态的处理过程中要改变状态,例如打开之后立即关闭这种效果
//context.changestfromnum(2);
}
}
classcstatea2implementsstate{
publicvoidhandle(contextacontext){
system.out.println("state2");
}
}
//工厂型
//根据状态不通生成不同的state
//classstatefactory{
//publicstaticstategetstateinstance(intnum){
//statest=null;
//
//if(num==1){
//st=newcstatea1();
//}
//elseif(num==2){
//st=newcstatea2();
//}
//
//returnst;
//}
//}
//strategy
//跟bridge相类似,就是一种多态的表示
//visitor
//双向引用,使用另外的一个类调用自己的方法,访问自己的数据结构
interfacevisitor{
voidvisitelement(elementdelement);
}
classcvisitorimplementsvisitor{
publicvoidvisitelement(elementdelement){
element.operation();
}
}
interfaceelementd{
voidaccept(visitorvisitor);
voidoperation();
}
classcelementdimplementselementd{
publicvoidaccept(visitorvisitor){
visitor.visitelement(this);
}
publicvoidoperation(){
//实际的操作在这里
}
}
classclientd{
publicstaticvoidmain(){
elementdelm=newcelementd();
visitorvis=newcvisitor();
vis.visitelement(elm);
}
}
//iteraotr
//使用迭代器对一个类的数据结构进行顺序迭代
interfacestructure{
interfaceiteratora{
voidfirst();
booleanhaselement();
objectnext();
}
}
classstructure1implementsstructure{
object[]objs=newobject[100];
//使用内部类是为了对struture1的数据结构有完全的访问权
classiteratora1implementsiteratora{
intindex=0;
publicvoidfirst(){
index=0;
}
publicbooleanhaselement(){
returnindex<100;
}
publicobjectnext(){
objectobj=null;
if(haselement()){
obj=objs[index];
index++;
}
returnobj;
}
}
}
//meditor
classa1{
publicvoidoperation1(){}
publicvoidoperation2(){}
}
classa2{
publicvoidoperation1(){}
publicvoidoperation2(){}
}
classmediator{
a1a1;
a2a2;
publicmediator(a1a1,a2a2){
this.a1=a1;
this.a2=a2;
}
//如果我想实现这个功能我可能会把他放在a1中
//但是这样耦合大,我不想在a1中出现a2对象的引用,
//所以我使用了mediator作为中介
publicvoidmmed1(){
a1.operation1();
a2.operation2();
}
publicvoidmmed2(){
a2.operation1();
a1.operation2();
}
}
//command
//我认为就是将方法转换成了类
classreceiver{
publicvoidaction1(){}
publicvoidaction2(){}
}
interfacecommand{
voidexecute();
}
classccommand1implementscommand{
privatereceiverreceiver;
publicccommand1(receiverreceiver){
this.receiver=receiver;
}
publicvoidexecute(){
receiver.action1();
}
}
classccommand2implementscommand{
privatereceiverreceiver;
publicccommand2(receiverreceiver){
this.receiver=receiver;
}
publicvoidexecute(){
receiver.action2();
}
}
//observer
//在这里看似乎这个模式没有什么用
//但是如果我有一个线程监控subject,如果subject的状态
//发生了变化,则更改observer的状态,并出发一些操作,这样就有实际的意义了
//observer与visitor有相似的地方,都存在双向引用
//subject可以注册很多observer
interfacesubjectb{
voidattach(observerobserver);
voiddetach(observerobserver);
voidmynotify();
intgetstate();
voidsetstate(intstate);
}
classsubjectb1implementssubjectb{
listobservers=newarraylist();
intstate;
publicvoidattach(observerobserver){
observers.add(observer);
}
publicvoiddetach(observerobserver){
observers.remove(observer);
}
publicvoidmynotify(){
observerobserver=null;
iteratorit=observers.iterator();
while(it.hasnext()){
observer=(observer)it.next();
observer.update();
}
}
publicintgetstate(){
returnstate;
}
publicvoidsetstate(intstate){
this.state=state;
}
}
interfaceobserver{
voidupdate();
}
classobserver1implementsobserver{
subjectbsubject;
intstate;
publicobserver1(subjectbsubject){
this.subject=subject;
}
publicvoidupdate(){
this.state=subject.getstate();
}
publicvoidoperation(){
//一些基于state的操作
}
}
//memento
//感觉此模式没有什么大用
classmemento{
intstate;
publicintgetstate(){
returnstate;
}
publicvoidsetstate(intstate){
this.state=state;
}
}
classoriginator{
intstate;
publicvoidsetmemento(mementomemento){
state=memento.getstate();
}
publicmementocreatememento(){
mementomemento=newmemento();
memento.setstate(1);
returnmemento;
}
publicintgetstate(){
returnstate;
}
publicvoidsetstate(intstate){
this.state=state;
}
}
classcaretaker{
mementomemento;
publicvoidsavermemento(mementomemento){
this.memento=memento;
}
publicmementoretrievememento(){
returnmemento;
}
}
//程序最终还是顺序执行的,是由不通部分的操作拼接起来的
//将不同类的代码拼接起来是通过引用实现的,有了引用我就
//相当于有了一定访问数据结构和方法的能力,这与写在类内部
//差不多,例如我想将一个类中的一个方法抽离出去,因为这个方法依赖与此类的数据和其他方法
//直接将代码移走是不行的,但如果我们拥有了此类对象的引用,则与写在此类
//内部无异,所以我们拥有了引用就可以将此方法移出
publicclasstt1{
publicstaticvoidmain(string[]args){
}
}