JAVA常用设计模式追美眉技术详解.docx
- 文档编号:1245137
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:26
- 大小:30.12KB
JAVA常用设计模式追美眉技术详解.docx
《JAVA常用设计模式追美眉技术详解.docx》由会员分享,可在线阅读,更多相关《JAVA常用设计模式追美眉技术详解.docx(26页珍藏版)》请在冰点文库上搜索。
JAVA常用设计模式追美眉技术详解
Java常用设计模式之追美眉技术详解
目录
设计模式1
创建模式2
设计模式之Factory-工厂模式2
设计模式之FACTORYMETHOD-工厂方法模式2
设计模式之Builder-建造模式4
设计模式之PROTOTYPE-原始模型模式5
设计模式之Singleton-单例模式6
结构模式7
设计模式之Adapter-适配器7
设计模式之Bridge-桥梁模式8
设计模式之Composite-合成模式10
设计模式之DECORATOR-装饰模式11
设计模式之Facade-门面模式13
设计模式之FLYWEIGHT-享元模式14
设计模式之PROXY-代理模式15
行为模式16
设计模式之ChainofResponsibility-职责链16
设计模式之COMMAND-命令模式17
设计模式之INTERPRETER-解释器模式19
设计模式之ITERATOR-迭代子模式19
设计模式之MEDIATOR-调停者模式21
设计模式之MEMENTO-备忘录模式22
设计模式之OBSERVER-观察者模式23
设计模式之STATE-状态模式25
设计模式之STRATEGY-策略模式26
设计模式之TEMPLATEMETHOD-模板方法模式27
设计模式之VISITOR-访问者模式28
设计模式
分类
创建模式
结构模式
行为模式
优点
面向界面编程
降低耦合性
增加灵活性
创建模式
设计模式之Factory-工厂模式
客户类和工厂类分开。
消费者任何时候需要某种产品,只需向工厂请求即可。
消费者无须修改就可以接纳新产品。
缺点是当产品修改时,工厂类也要做相应的修改。
设计模式之FACTORYMETHOD-工厂方法模式
追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。
麦当劳和肯德基就是生产鸡翅的Factory
publicclassFactory{
publicstaticSamplecreator(intwhich){
//getClass产生Sample一般可使用动态类装载装入类。
if(which==1)
returnnewSampleA();
elseif(which==2)
returnnewSampleB();
}
}
核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
publicabstractclassFactory{
publicabstractSamplecreator();
publicabstractSample2creator(Stringname);
}
publicclassSimpleFactoryextendsFactory{
publicSamplecreator(){
.........
returnnewSampleA
}
publicSample2creator(Stringname){
.........
returnnewSample2A
}
}
publicclassBombFactoryextendsFactory{
publicSamplecreator(){
......
returnnewSampleB
}
publicSample2creator(Stringname){
......
returnnewSample2B
}
}
设计模式之Builder-建造模式
将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。
建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。
(这一定比美军在伊拉克用的翻译机好卖)
publicinterfaceBuilder{
//创建部件A 比如创建汽车车轮
voidbuildPartA();
//创建部件B比如创建汽车方向盘
voidbuildPartB();
//创建部件C比如创建汽车发动机
voidbuildPartC();
//返回最后组装成品结果(返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director类别中进行。
//从而实现了解耦过程和部件
ProductgetResult();}
publicclassDirector{
privateBuilderbuilder;
publicDirector(Builderbuilder){
this。
builder=builder;
}
//将部件partApartBpartC最后组成复杂对象
//这里是将车轮方向盘和发动机组装成汽车的过程
publicvoidconstruct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
设计模式之PROTOTYPE-原始模型模式
通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。
原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。
缺点是每一个类都必须配备一个克隆方法。
跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。
(100块钱一份,你要不要)
publicabstractclassAbstractSpoonimplementsCloneable
{
StringspoonName;
publicvoidsetSpoonName(StringspoonName){this.spoonName=spoonName;}
publicStringgetSpoonName(){returnthis.spoonName;}
publicObjectclone()
{
Objectobject=null;
try{
object=super.clone();
}catch(CloneNotSupportedExceptionexception){
System.err.println("AbstractSpoonisnotCloneable");
}
returnobject;
}
}
publicclassSoupSpoonextendsAbstractSpoon
{
publicSoupSpoon()
{
setSpoonName("SoupSpoon");
}
}
publicclassSaladSpoonextendsAbstractSpoon
{
publicSaladSpoon()
{
setSpoonName("SaladSpoon");
}
}
设计模式之Singleton-单例模式
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。
单例模式只应在有真正的“单一实例”的需求时才可使用。
俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)
publicclassSingleton{
privatestaticSingletoninstance=null;
publicstaticsynchronizedSingletongetInstance(){
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if(instance==null)
instance=newSingleton();
returninstance;
}
}
结构模式
设计模式之Adapter-适配器
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。
适配类可以根据参数返还一个合适的实例给客户端。
在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)
publicinterfaceIRoundPeg{
publicvoidinsertIntoHole(Stringmsg);
}
publicinterfaceISquarePeg{
publicvoidinsert(Stringstr);
}
publicclassPegAdapterimplementsIRoundPeg,ISquarePeg{
privateRoundPegroundPeg;
privateSquarePegsquarePeg;
//构造方法
publicPegAdapter(RoundPegpeg){this.roundPeg=peg;}
//构造方法
publicPegAdapter(SquarePegpeg)(this.squarePeg=peg;)
publicvoidinsert(Stringstr){roundPeg.insertIntoHole(str);}
publicvoidinsertIntoHole(Stringstr){SquarePeg.insert(str);}
}
设计模式之Bridge-桥梁模式
将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。
不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了
publicabstractclassCoffee
{
CoffeeImpcoffeeImp;
publicvoidsetCoffeeImp(){
this.CoffeeImp=CoffeeImpSingleton.getTheCoffeImp();
}
publicSodaImpgetCoffeeImp(){returnthis.CoffeeImp;}
publicabstractvoidpourCoffee();
}
publicabstractclassCoffeeImp
{
publicabstractvoidpourCoffeeImp();
}
//bridge
publicclassCoffeeImpSingleton
{
privatestaticCoffeeImpcoffeeImp;
publicCoffeeImpSingleton(CoffeeImpcoffeeImpIn)
{this.coffeeImp=coffeeImpIn;}
publicstaticCoffeeImpgetTheCoffeeImp()
{
returncoffeeImp;
}
}
设计模式之Composite-合成模式
合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。
合成模式就是一个处理对象的树结构的模式。
合成模式把部分与整体的关系用树结构表示出来。
合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
Mary今天过生日。
“我过生日,你要送我一件礼物。
”“嗯,好吧,去商店,你自己挑。
”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。
”“喂,买了三件了呀,我只答应送一件礼物的哦。
”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。
”“……”,MM都会用Composite模式了,你会了没有?
publicabstractclassEquipment
{
privateStringname;
//网络价格
publicabstractdoublenetPrice();
//折扣价格
publicabstractdoublediscountPrice();
//增加部件方法
publicbooleanadd(Equipmentequipment){returnfalse;}
//删除部件方法
publicbooleanremove(Equipmentequipment){returnfalse;}
//注意这里,这里就提供一种用于访问组合体类别的部件方法。
publicIteratoriter(){returnnull;}
publicEquipment(finalStringname){this.name=name;}
}
publicclassDiskextendsEquipment
abstractclassCompositeEquipmentextendsEquipment
设计模式之DECORATOR-装饰模式
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。
动态给一个对象增加功能,这些功能可以再动态的撤消。
增加由一些基本功能的排列组合而产生的非常大量的功能。
Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?
publicinterfaceWork
{
publicvoidinsert();
}
publicclassSquarePegimplementsWork{
publicvoidinsert(){
System.out.println("方形桩插入");
}
}
publicclassDecoratorimplementsWork{
privateWorkwork;
//额外增加的功能被打包在这个List中
privateArrayListothers=newArrayList();
//在构造器中使用组合new方式,引入Work对象;
publicDecorator(Workwork)
{
this.work=work;
others.add("挖坑");
others.add("钉木板");
}
publicvoidinsert(){
newMethod();
}
//在新方法中,我们在insert之前增加其它方法,这里次序先后是用户灵活指定的
publicvoidnewMethod()
{
otherMethod();
work.insert();
}
publicvoidotherMethod()
{
ListIteratorlistIterator=others.listIterator();
while(listIterator.hasNext())
{
System.out.println(((String)(listIterator.next()))+"正在进行");
}
}
}
设计模式之Facade-门面模式
外部与一个子系统的通信必须通过一个统一的门面对象进行。
门面模式提供一个高层次的接口,使得子系统更易于使用。
每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。
但整个系统可以有多个门面类。
我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。
幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。
publicclassDBCompare{
Stringsql="SELECT*FROM