package bridgeMode;
/*
* 实现手机+游戏
*/
public class Commonly {
public static void main(String[] args) {
xiaomiGame game = new xiaomiGame();
game.Run();
//如果要增加一种手机类型 看Commonly2
}
}
/*
* 小米手机+游戏
*/
class xiaomiGame{
public void Run(){
System.out.println("运行小米手机游戏");
}
}
package bridgeMode;
/*
* 实现手机+游戏
*/
public class Commonly2 {
public static void main(String[] args) {
Game game = new xiaomiGame2();
Game game2 = new huaweiGame2();
game.Run();game2.Run();
//这里用了抽象 吧Game抽象成父类 抽象思想值得提倡
//如果要加手机其他功能呢? 比如照相 放歌 打电话? 看Commonly3
}
}
abstract class Game{
public abstract void Run();
}
/*
* 小米手机+游戏
*/
class xiaomiGame2 extends Game{
public void Run(){
System.out.println("运行小米手机游戏");
}
}
/*
* 华为
*/
class huaweiGame2 extends Game{
public void Run(){
System.out.println("运行华为手机游戏");
}
}
package bridgeMode;
/*
* 实现手机+游戏
* Commonly2 是对游戏进行了抽象 但是如果需要在手机某个品牌上加功能 就需要给手机品牌进行抽象。。。
*/
public class Commonly3 {
public static void main(String[] args) {
Brand brand ;
brand = new xiaomiGame3();
brand.Run();
brand = new huaweiGame3();
brand.Run();
brand = new xiaomiMusic3();
brand.Run();
brand = new huaweiMusic3();
brand.Run();
//如果现在再加一个vivo手机 也具备相同的功能 那肯怎么办呢? 添加3个类
//读者可以 用手机软件进行分类 把最终的Brand父类 改为Soft 以软件来进行分类 然后不同的手机软件继承软件父类 这样也是解决不了问题的 如果添加新的手机 或软件 也是需要添加好多类的
//怎么办 看BridgeMode.java
}
}
/*
* 手机品牌抽象
*/
class Brand{
public void Run(){
}
}
/*
* 小米手机
*/
class xiaomi extends Brand{
}
/*
* 华为手机
*/
class huawei extends Brand{
}
//小米游戏
class xiaomiGame3 extends xiaomi{
public void Run(){
System.out.println("小米 游戏");
}
}
//华为游戏
class huaweiGame3 extends xiaomi{
public void Run(){
System.out.println("华为 游戏");
}
}
//小米音乐
class xiaomiMusic3 extends xiaomi{
public void Run(){
System.out.println("小米 音乐");
}
}
//小米音乐
class huaweiMusic3 extends xiaomi{
public void Run(){
System.out.println("华为 音乐");
}
}
package bridgeMode;
/*
* 桥接模式:
* 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
* 它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
*
*
*/
public class BridgeMode {
public static void main(String[] args) {
Soft soft = new Game6();
Soft soft2 = new Music6();
xiaomi6 xiaomi6 = new xiaomi6();
huawei6 huawei6 = new huawei6();
xiaomi6.setSoft(soft);
xiaomi6.Run();
huawei6.setSoft(soft);
huawei6.Run();
xiaomi6.setSoft(soft2);
xiaomi6.Run();
huawei6.setSoft(soft2);
huawei6.Run();
}
}
/*
* 对象的继承关系是在编译时就定义好了,所以无法再运行是改变从父类继承的实现,,,, 子类的实现与父类有非常紧密的联系
* 以至于父类实现中的任何变化必然会导致子类发生变化 当你需要复用子类时 如果继承下来的实现不能解决新的问题
* 则父类必须重写 或被其他更适合的类替换 这种依赖关系限制了了灵活性 并最终限制了复用性
*/
/*
*合成/聚合复用原则 :尽量使用合成/聚合 尽量不要使用类继承
*
*聚合表示一种弱的拥有关系 比如说你属于你现在所在的公司A包含B 但是B不是A对象的一部分
* :比如 鱼缸中每条鱼都属于这个鱼缸 但是鱼缸中包含好多小鱼
*合成则是一种强的拥有关系,体现了严重的部分与整体的关系:
* :比如 鱼的尾巴属于鱼 鱼只有一个尾巴
*
*/
/*
* 手机软件
*/
abstract class Soft{
public abstract void Run();
}
//游戏 音乐 等软件
// 游戏
class Game6 extends Soft{
public void Run() {
System.out.println("游戏");
}
}
//音乐
class Music6 extends Soft{
public void Run() {
System.out.println("音乐");
}
}
/*
* 品牌抽象
*/
abstract class Brand6{
protected Soft soft;
public void setSoft(Soft soft){
this.soft = soft;
}
public abstract void Run();
}
//小米
class xiaomi6 extends Brand6{
public void Run() {
System.out.print("小米手机:");
soft.Run();
}
}
//小米
class huawei6 extends Brand6{
public void Run() {
System.out.print("华为手机:");
soft.Run();
}
}