桥接模式 bridge


桥接模式: 将抽象和行为划分开来,各自独立,但能动态的结合。
    在这里抽象不是表示抽象类或接口,而是表示对应于现实的一种实体的集合。比如说人就是一种抽象,吃饭就是一种行为。抽象不一定有行为。但行为一定是依附于抽象的。对于抽象的不同子集会有不同的行为。而同样的行为也可能属于抽象的不同子集。这样我们可以把行为抽取出来进行不重不漏的分类封装。从而和抽象的子集进行"排列组合"。
类图:
桥接模式 bridge

下面来谈一谈防盗门。如果我们把门设计成和门的防盗功能结合在一起。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1桥接模式 bridge public abstract class Door
 2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
 3桥接模式 bridge        public  void Open()
 4桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
 5桥接模式 bridge            System.Diagnostics.Debug.WriteLine("base open;");
 6桥接模式 bridge        }

 7桥接模式 bridge        public  void Close()
 8桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
 9桥接模式 bridge            System.Diagnostics.Debug.WriteLine("base close;");
10桥接模式 bridge        }

11桥接模式 bridge        public virtual void AgainstTheft()
12桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
13桥接模式 bridge            System.Diagnostics.Debug.WriteLine("base AgainstTheft;");
14桥接模式 bridge        }

15桥接模式 bridge    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1桥接模式 bridge class WoodAgStrikeDoor:Door
2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
3桥接模式 bridge        public override void AgainstTheft()
4桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
5桥接模式 bridge            System.Diagnostics.Debug.WriteLine("AgStrike AgainstStrike;");
6桥接模式 bridge            //这个用来方砸的
7桥接模式 bridge        }

8桥接模式 bridge    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1桥接模式 bridgepublic class WoodAgPrizeDoor:Door
 2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
 3桥接模式 bridge        public void Open()
 4桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
 5桥接模式 bridge            System.Diagnostics.Debug.WriteLine("AgThDoor open;");
 6桥接模式 bridge        }

 7桥接模式 bridge        public void Close()
 8桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
 9桥接模式 bridge            System.Diagnostics.Debug.WriteLine("AgThDoor close;");
10桥接模式 bridge        }

11桥接模式 bridge        public override void AgainstTheft()
12桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
13桥接模式 bridge            System.Diagnostics.Debug.WriteLine("AgThDoor AgainstTheft;");
14桥接模式 bridge            //这个用来防撬
15桥接模式 bridge        }

16桥接模式 bridge    }

   这样好像是没什么问题吧。不过贼就只会撬,砸什么的吗?他还会砍什么的。那有多少种我们就实现多少种AgainstTheft()吧。这个不存在什么问题。
天啊,刚才讨论的仅仅是木门,别忘了世界上可不止一种门。什么木门啊,铁门啊,什么塑料门啊,钢门就别算了。那这么一算是三种门三种防盗方式。 3*3就要实现9个类。估计这时候你要砸键盘了。要是30*30呢人就疯掉了。
  怎么去改进呢,仔细思考一下,我们的Door既有门的功能又有防盗的功能。但是现实还可以是这么一种情况,门只具有门的功能加上防盗器才具有防盗的功能。门和防盗器之间可以自由的组合,那现在好了 30*30 变成 30+30啦。这个世界清净了,不用做这么多傻逼的重复劳动了。
  那重新设计一下吧:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1桥接模式 bridge public abstract class Door
 2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
 3桥接模式 bridge        protected ITheftAgainstor theftAgainstor;
 4桥接模式 bridge
 5桥接模式 bridge        public void SetTheftAgainstor(ITheftAgainstor obj)
 6桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
 7桥接模式 bridge            theftAgainstor = obj;
 8桥接模式 bridge        }

 9桥接模式 bridge        public void Open()
10桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
11桥接模式 bridge            System.Diagnostics.Debug.WriteLine("base open;");
12桥接模式 bridge        }

13桥接模式 bridge        public void Close()
14桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
15桥接模式 bridge            System.Diagnostics.Debug.WriteLine("base close;");
16桥接模式 bridge        }

17桥接模式 bridge       public void AgainstTheft()
18桥接模式 bridge桥接模式 bridge       桥接模式 bridge{
19桥接模式 bridge           theftAgainstor.AgainstTheft();
20桥接模式 bridge       }

21桥接模式 bridge
22桥接模式 bridge    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1桥接模式 bridgepublic class WoodDoor : Door
2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
3桥接模式 bridge        public void AgainstTheft()
4桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
5桥接模式 bridge
6桥接模式 bridge        }

7桥接模式 bridge    }

//防盗器的接口
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1桥接模式 bridge public interface ITheftAgainstor
2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
3桥接模式 bridge        void AgainstTheft();
4桥接模式 bridge    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1桥接模式 bridgepublic class StrikeAgainstor:Strategy.ITheftAgainstor
2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
3桥接模式 bridge      public  void AgainstTheft()
4桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
5桥接模式 bridge            System.Diagnostics.Debug.WriteLine(this.ToString());
6桥接模式 bridge        }

7桥接模式 bridge    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1桥接模式 bridge public class ChopAgainstor : ITheftAgainstor
2桥接模式 bridge桥接模式 bridge    桥接模式 bridge{
3桥接模式 bridge        public void AgainstTheft()
4桥接模式 bridge桥接模式 bridge        桥接模式 bridge{
5桥接模式 bridge            System.Diagnostics.Debug.WriteLine(this.ToString());
6桥接模式 bridge        }

7桥接模式 bridge    }

调用代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1桥接模式 bridge Door door = new Strategy.WoodDoor();//造一张木门了。
2桥接模式 bridge            door.SetTheftAgainstor(new StrikeAgainstor());//防砸的
3桥接模式 bridge            door.AgainstTheft();
4桥接模式 bridge
5桥接模式 bridge            door.SetTheftAgainstor(new ChopAgainstor());//防砍的
6桥接模式 bridge            door.AgainstTheft();

                 接下来你可以试试 铁门啊什么的。

     你可能在想,防盗器本身不也是一种现实中实体的集合吗,不也是一种抽象吗。不过自然、人类就是天生的解耦高手,谁知道世界上的第一张防盗门是不是门本身具有防盗功能呢(这个没必要考究了,我本身也怀疑这样的想法,不做个假设又何妨呢),只是在时间和人类的智慧在悄悄的改变这个世界,重构这个世界。防盗的功能也被人类智慧封装到一个叫防盗器的类里面了。程序本身也是对这个世界的模型的一种模拟。如果你觉得下面这个设计本该如此,那么它就是对这个世界的合理的模拟了。