22.桥接模式

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();
	}
	
}



上一篇:React —— 使用Fragments不增DOM节点返回多个子节点


下一篇:React应该如何优雅的绑定事件?