|
|
|
|
|
|
|
我的理解对不对呀?谢谢回答? Decorator(油漆工)模式:实质就是给一个对象动态添加功能,具体是有一个类A,A假设只有一个功能或没有我所想要的功能,但A类不能修改,怎么办?我就可以写一个Decorator油漆工类,让这个类帮我给A类添加功能,编译期间A根本不知道要给他添加什么功能,只有在运行期间才知道.因为有不同的Decorator类,所以,给A添加功能可以看成是动态的?相当于一个只有A功能的类让别一个B类包装,则B类就除了有A功能,还有B中新添加的功能. >Bridge模式:就是将抽象和行为分开,分别都有自己的接口和实现,这样,抽象可以任意添加,行为也可以任意添加,而互相不影响各自,比如记日志,日志是接口,有不同的实现:TXT日志,DB日志,行为是怎么记法?在.NET和JAVA平台下有不同的记法,如果再添加一个记法:Other,则不需要修改任何类,这个模式主要是增强程序的可扩展性,降代类之间的耦合 > >/** > * 抽象接口 > */ >abstract class Log { > protected LogImpl logImpl;// 行为 > > public void setImpl(LogImpl logImpl) { > this.logImpl = logImpl; > } > > public abstract void write(); >} > >/** > * 行为接口 > * > */ >abstract class LogImpl { > public abstract void writeLog(); >} > >/** > * 对抽象的实现 > * > */ >class TextLog extends Log { > > public void write() { > System.out.print("write text log in "); > logImpl.writeLog(); > } >} > >/** > * 对抽象的实现 > * > */ >class DBLog extends Log { > public void write() { > System.out.print("write db log in "); > logImpl.writeLog(); > } >} > >/** > * 对抽象的实现 > * > */ >class OtherLog extends Log { > public void write() { > System.out.print("write other log in "); > logImpl.writeLog(); > } >} > >/** > * 对行为的实现 > * > */ >class JavaLogImpl extends LogImpl { > public void writeLog() { > System.out.println("java"); > } >} > >/** > * 对行为的实现 > * > */ >class DotNetLogImpl extends LogImpl { > public void writeLog() { > System.out.println(".NET"); > } >} > >/** > * 对行为的实现 > * > */ >class OtherLogImpl extends LogImpl { > public void writeLog() { > System.out.println("other"); > } >} > >public class TestBridgePattern { > > /** > * @param args > */ > public static void main(String[] args) { > // TODO Auto-generated method stub > // .NET平台下的Database log > Log dblog = new DBLog(); > dblog.setImpl(new DotNetLogImpl()); > dblog.write(); > // Java平台下的TEXT log > Log txtlog = new TextLog(); > txtlog.setImpl(new JavaLogImpl()); > txtlog.write(); > > // 其它平台下的其它行为 > Log otherLog = new OtherLog(); > otherLog.setImpl(new OtherLogImpl()); > otherLog.write(); > } >}
|
|
|
|
|
|
Re: 你好banq,请教模式
|
2006年10月17日 11:23
|
|
|
基本理解正确,Decorator(油漆工)模式和Bridge模式都是侧重于对象行为的模式,他们是结构模式,主要是用来考虑对象的行为复杂变化时,如何进行结构搭建:以使得这个结构能够适应将来行为变化。
所以这两个模式在Evans DDD中用在Service方面比较多。
>编译期间A根本不知道要给他添加什么功能,只有在运行期间才知道 这句话有些欠妥,A无论什么时候不会知道,也无须知道给他添加什么功能,这才是解耦的体现,如果他需要知道,就和新的功能耦合了。
>抽象可以任意添加,行为也可以任意添加, 模式总是在淡化一个方面,再突出另外一个方面,我们使用某个模式应付变化,正如万事万物有阴有阳,必然有其不变的地方,桥模式不变的地方时抽象,变化的是行为,也就是说:如果你的需求是抽象可能变化,那么使用桥模式就不恰当了。
当然,可以多个模式结合在一起,优缺互补,形成一个强大的框架,这也是不错的。
|
|
|
|