百度网站降级的原因,服务器能放多少个网站,wordpress企业产品列表,网站制作导航超链接怎么做1.1 凭什么你的游戏我不能玩
2007年苹果手机尚未出世#xff0c;机操作系统多种多样#xff08;黑莓、塞班、Tizen等#xff09;#xff0c;互相封闭。而如今#xff0c;存世的手机操作系统只剩下苹果OS和安卓#xff0c;鸿蒙正在稳步进场。
1.2 紧耦合的程序演化
手机…1.1 凭什么你的游戏我不能玩
2007年苹果手机尚未出世机操作系统多种多样黑莓、塞班、Tizen等互相封闭。而如今存世的手机操作系统只剩下苹果OS和安卓鸿蒙正在稳步进场。
1.2 紧耦合的程序演化
手机硬件软件和PC硬件软件现在有一个N品牌的手机它有一个小游戏M品牌的手机它有一个小游戏.
代码结构图 package code.chapter22.bridge1;public class Test {public static void main(String[] args) {System.out.println(**********************************************); System.out.println(《大话设计模式》代码样例);System.out.println(); HandsetBrandNGame gamenew HandsetBrandNGame();game.run();HandsetGame game2 new HandsetBrandMGame();game2.run();System.out.println();System.out.println(**********************************************);}
}// //手机品牌N的游戏
// class HandsetBrandNGame {
// public void run(){
// System.out.println(运行N品牌手机游戏);
// }
// }//手机游戏类
class HandsetGame{public void run(){}
}//手机品牌M的游戏
class HandsetBrandMGame extends HandsetGame{public void run(){System.out.println(运行M品牌手机游戏);}
}
//手机品牌N的游戏
class HandsetBrandNGame extends HandsetGame{public void run(){System.out.println(运行N品牌手机游戏);}
}
如果我现在需要每个品牌都增加一个音乐播放功能那就在每个品牌的下面增加一个子类。现在又来了一家新的手机品牌S,它也有游戏、通讯录、音乐播放器那就增加手机品牌S类和三个下属功能子类如果我需要增加“”输入法”功能、拍照功能再增加L品牌X品牌呢 上面好像也解决不了问题。 是呀就像我刚开始学会用面向对象的继承时感觉它既新颖又功能强大所以只要可以用就都用上继承。这就好比是有了新锤子所有的东西看上去都成了钉子。DPE但事实上很多情况用继承会带来麻烦。比如对象的继承关系是在编译时就定义好了所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时如果继承下来的实现不适合解决新的问题则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性DP。 是呀我这样的继承结构如果不断地增加新品牌或新功能类会越来越多的。 在面向对象设计中我们还有一个很重要的设计原则那就是合成聚合复用原则。即优先使用对象合成聚合而不是类继承DP。
1.3 合成/聚合复用原则 合成聚合复用原则CARP尽量使用合成聚合尽量不要使用类继承。JDP 合成Composition也有翻译成组合和聚合Aggregation都是关联的特殊种类。 聚合表示一种弱的拥有关系体现的是A对象可以包含B对象但B对象不是A对象的一部分合成则是一种强的拥有关系体现了严格的部分和整体的关系部分和整体的生命周期一样DPE。比方说大雁有两个翅膀翅膀与大雁是部分和整体的关系并且它们的生命周期是相同的于是大雁和翅膀就是合成关系。而大雁是群居动物所以每只大雁都是属于一个雁群一个雁群可以有多只大雁所以大雁和雁群是聚合关系。 合成聚合复用原则的好处是优先使用对象的合成聚合将有助于你保持每个类被封装并被集中在单个任务上。这样类和类继承层次会保持较小规模并且不太可能增长为不可控制的庞然大物DP。就刚才的例子你需要学会用对象的职责而不是结构来考虑问题。其实答案就在之前我们聊到的手机与电脑的差别上。 哦我想想看手机是不同的品牌公司各自做自己的软件就像我现在的设计一样而PC却是硬件厂商做硬件软件厂商做软件组合起来才是可以用的机器。你是这个意思吗 很好我很喜欢你提到的组合这个词实际上像游戏通讯录MP3音乐播放这些功能都是软件如果我们可以让其分离与手机的耦合那么就可以大大减少面对新需求时改动过大的不合理情况。 好的好的我想想怎么弄你的意思其实就是应该有个手机品牌抽象类和手机软件抽象类让不同的品牌和功能都分别继承于它们这样要增加新的品牌或新的功能都不用影响其他类了。 结构图 还剩个问题手机品牌和手机软件之间的关系呢 我觉得应该是手机品牌包含手机软件但软件并不是品牌的一部分所以它们之间是聚合关系。 结构图 1.4 松耦合的程序
package code.chapter22.bridge2;public class Test {public static void main(String[] args) {System.out.println(**********************************************); System.out.println(《大话设计模式》代码样例);System.out.println(); HandsetBrand ab;ab new HandsetBrandMAddressList();ab.run();ab new HandsetBrandMGame();ab.run();ab new HandsetBrandNAddressList();ab.run();ab new HandsetBrandNGame();ab.run();System.out.println();System.out.println(**********************************************);}
}//手机品牌
class HandsetBrand{public void run(){}
}//手机品牌M
class HandsetBrandM extends HandsetBrand{}
//手机品牌N
class HandsetBrandN extends HandsetBrand{}//手机品牌M的游戏
class HandsetBrandMGame extends HandsetBrandM{public void run(){System.out.println(运行M品牌手机游戏);}
}
//手机品牌N的游戏
class HandsetBrandNGame extends HandsetBrandN{public void run(){System.out.println(运行N品牌手机游戏);}
}//手机品牌M的通讯录
class HandsetBrandMAddressList extends HandsetBrandM{public void run(){System.out.println(运行M品牌手机通讯录);}
}
//手机品牌N的通讯录
class HandsetBrandNAddressList extends HandsetBrandN{public void run(){System.out.println(运行N品牌手机通讯录);}
} 是呀现在如果要增加一个功能比如手机音乐播放功能那么只要增加这个类就行了。不会影响其他任何类。类的个数增加也只是一个。 如果是要增加S品牌只需要增加一个品牌子类就可以了。个数也是一个不会影响其他类的改动。
package code.chapter22.bridge3;public class Test {public static void main(String[] args) {System.out.println(**********************************************); System.out.println(《大话设计模式》代码样例);System.out.println(); HandsetBrand ab;ab new HandsetBrandM();ab.setHandsetSoft(new HandsetGame());ab.run();ab.setHandsetSoft(new HandsetAddressList());ab.run();HandsetBrand ab2;ab2 new HandsetBrandN();ab2.setHandsetSoft(new HandsetGame());ab2.run();ab2.setHandsetSoft(new HandsetAddressList());ab2.run();//向扩展开放增加的功能HandsetBrand ab3;ab3 new HandsetBrandS();ab3.setHandsetSoft(new HandsetMusicPlay());ab3.run();System.out.println();System.out.println(**********************************************);}
}//手机软件
abstract class HandsetSoft{//运行public abstract void run();
}//手机游戏
class HandsetGame extends HandsetSoft{public void run(){System.out.println(手机游戏);}
}//手机通讯录
class HandsetAddressList extends HandsetSoft{public void run(){System.out.println(通讯录);}
}//手机品牌
abstract class HandsetBrand{protected HandsetSoft soft;//设置手机软件public void setHandsetSoft(HandsetSoft soft){this.softsoft;}//运行public abstract void run();
}//手机品牌M
class HandsetBrandM extends HandsetBrand{public void run(){System.out.print(品牌M);soft.run();}
}
//手机品牌N
class HandsetBrandN extends HandsetBrand{public void run(){System.out.print(品牌N);soft.run();}
}//手机音乐播放
class HandsetMusicPlay extends HandsetSoft{public void run(){System.out.print(音乐播放);}
}//手机品牌S
class HandsetBrandS extends HandsetBrand{public void run(){System.out.print(品牌S);soft.run();}
} 这显然也符合了我们之前的一个什么设计原则 开放-封闭原则。这样的设计显然不会修改原来的代码而只是扩展类就行了。但今天我感受最深的是合成聚合复用原则也就是优先使用对象的合成或聚合而不是类继承。聚合的魅力无限呀。相比继承的确很容易造成不必要的麻烦。 盲目使用继承当然就会造成麻烦而其本质原因主要是什么 我想应该是继承是一种强耦合的结构。父类变子类就必须要变。 OK所以我们在用继承时一定要在是is-a的关系时再考虑使用而不是任何时候都去使用。 哈当然你看看刚才画的那幅图两个抽象类之间有什么像什么 有一个聚合线哈像一座桥。 好说得好这个设计模式就叫作桥接模式。
1.5 桥接模式 桥接模式Bridge将抽象部分与它的实现部分分离使它们都可以独立地变化。DP 这里需要理解一下什么叫抽象与它的实现分离这并不是说让抽象类与其派生类分离因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象DPE。就刚才的例子而言就是让手机既可以按照品牌来分类也可以按照功能来分类。 按品牌分类实现结构图 按软件分类实现结构图 由于实现方式有多种桥接模式的核心意图是把这些实现独立出来让它们各自变化。这就使得每种实现的变化不会影响其他实现从而达到应对变化的目的。
1.6 桥接模式基本代码
桥接模式Bridge结构图 package code.chapter22.bridge0;public class Test {public static void main(String[] args) {System.out.println(**********************************************); System.out.println(《大话设计模式》代码样例);System.out.println(); Abstraction ab;ab new RefinedAbstraction();ab.setImplementor(new ConcreteImplementorA());ab.operation();ab.setImplementor(new ConcreteImplementorB());ab.operation();System.out.println();System.out.println(**********************************************);}
}abstract class Implementor{public abstract void operation();
}class ConcreteImplementorA extends Implementor{public void operation(){System.out.println(具体实现A的方法执行);}
}class ConcreteImplementorB extends Implementor{public void operation(){System.out.println(具体实现B的方法执行);}
}abstract class Abstraction{protected Implementor implementor;public void setImplementor(Implementor implementor){this.implementor implementor;}public abstract void operation();
}class RefinedAbstraction extends Abstraction{public void operation(){System.out.print(具体的Abstraction);implementor.operation();}
}
Implementor类 ConcreteImplementorA和ConcreteImplementorB等派生类Abstraction类 RefinedAbstraction类 我觉得桥接模式所说的将抽象部分与它的实现部分分离还是不好理解我的理解就是实现系统可能有多角度分类每一种分类都有可能变化那么就把这种多角度分离出来让它们独立变化减少它们之间的耦合。也就是说在发现我们需要多角度去分类实现对象而只用继承会造成大量的类增加不能满足开放-封闭原则时就应该要考虑用桥接模式了。
1.7 我要开发“好”游戏 我要是有钱就一定去买那种有操作系统把软件与手机分离的智能手机说不定我还可以自己开发手机游戏呢。