几种常见设计模式的JAVA实现例子

本文通过具体实例介绍了装饰者模式、适配器模式及代理模式的实现方法,并提供了代码示例,帮助读者更好地理解和应用这些设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重看head first设计模式,为了加深理解,练手把一些设计模式实现了一遍,

贴出来供大家批评指正。

装饰者模式:

package silenceburn; abstract class Componet{ abstract public void disp(); } class Wood extends Componet{ @Override public void disp() { // TODO Auto-generated method stub System.out.print(" wood "); } } abstract class Decorator extends Componet{ Componet cp; public Decorator(Componet cp){ this.cp = cp; } public void disp(){ this.decoratorDisp(); cp.disp(); } abstract protected void decoratorDisp(); } class RedDecorator extends Decorator{ public RedDecorator(Componet cp) { super(cp); // TODO Auto-generated constructor stub } @Override protected void decoratorDisp() { // TODO Auto-generated method stub System.out.print(" red "); } } class SmallDecorator extends Decorator{ public SmallDecorator(Componet cp) { super(cp); // TODO Auto-generated constructor stub } @Override protected void decoratorDisp() { // TODO Auto-generated method stub System.out.print(" Small "); } } public class ConcreteMode { public static void main(String args[]){ Wood w = new Wood(); RedDecorator r = new RedDecorator(w); SmallDecorator s = new SmallDecorator(r); s.disp(); } }

说明:可以给Wood加上任意多的装饰者实现,比如此例子中实现了两个装饰者,

一个是红色RED装饰,一个是小SMALL装饰,最终得到的是 红色的 小的 木头。

适配器模式:

package silenceburn; class M1911{ public void singleFire(){ System.out.print("da! "); } } class M16{ public void threeFire(){ System.out.println("da da da "); } } class M16Adapter extends M16{ M1911 m; M16Adapter(M1911 m){this.m = m;} public void threeFire() { m.singleFire();m.singleFire();m.singleFire(); }; } public class AdapterMode { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub M1911 m = new M1911(); M16 m16 = new M16Adapter(m); m16.threeFire(); } }

说明:M1911是,只能单发“DA!”,M16是突击步枪,可以三连发,“DA DA DA”

通过一个M16适配器,可以让表现的和M16相似,好像是一把M16一样。

代理模式:

package silenceburn; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Read{ public void print(); } class ReadProxy implements Read{ Read realRead; ReadProxy(Read a){this.realRead = a;} @Override public void print() { // TODO Auto-generated method stub int reading = 5; while(reading -- >0) System.out.println("wait " + reading); this.realRead.print(); } } class DynProxy implements InvocationHandler{ Read real; DynProxy(Read real){this.real = real;} @Override public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { // TODO Auto-generated method stub int reading = 5; while(reading -- >0) System.out.println("wait " + reading); arg1.invoke(real, arg2); return null; } } class ReadReal implements Read{ @Override public void print() { // TODO Auto-generated method stub System.out.println("this is real content"); } } public class ProxyMode { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //java Dynmanic Proxy Read r = new ReadReal(); Read rp = (Read) Proxy.newProxyInstance(r.getClass().getClassLoader(), r.getClass().getInterfaces(), new DynProxy(r)); rp.print(); // my define Proxy Read r2 = new ReadReal(); Read r2p = new ReadProxy(r2); r2p.print(); } }

说明:实现了两个代理,功能都是在真正的打印前,打印倒数4,3,2,1,0。

第一个代理自己写代码实现。第二个代理是用JAVA的动态代理功能实现。

其余还有策略模式,观察者模式,状态模式,工厂模式的代码,比较常见,就不贴了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值