你好banq,请教模式

我的理解对不对呀?谢谢回答?
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();
> }
>}

基本理解正确,Decorator(油漆工)模式和Bridge模式都是侧重于对象行为的模式,他们是结构模式,主要是用来考虑对象的行为复杂变化时,如何进行结构搭建:以使得这个结构能够适应将来行为变化。

所以这两个模式在Evans DDD中用在Service方面比较多。

>编译期间A根本不知道要给他添加什么功能,只有在运行期间才知道
这句话有些欠妥,A无论什么时候不会知道,也无须知道给他添加什么功能,这才是解耦的体现,如果他需要知道,就和新的功能耦合了。

>抽象可以任意添加,行为也可以任意添加,
模式总是在淡化一个方面,再突出另外一个方面,我们使用某个模式应付变化,正如万事万物有阴有阳,必然有其不变的地方,桥模式不变的地方时抽象,变化的是行为,也就是说:如果你的需求是抽象可能变化,那么使用桥模式就不恰当了。

当然,可以多个模式结合在一起,优缺互补,形成一个强大的框架,这也是不错的。