桥接模式官方类图:
我的例子场景:游戏有不同的英雄,不同的英雄有不同的技能,而且英雄的技能是可以变化的,比如英雄一有技能一,英雄二也可以有技能一。
首先设计一个技能接口,两个技能类实现该接口,然后设计一个英雄抽象类,聚合技能接口,在构造函数实例化,设计两个英雄类继承该英雄抽象类,最后是客户端主类。
技能接口代码:
package com.freshbin.pattern.bridge.myexample.skill;
/**
* 英雄技能接口
*
* @author freshbin
* @date 2019年1月12日 下午8:13:00
*/
public interface HeroSkillInterface {
void firstSkill();
void secondSkill();
}
两个技能实现类:
package com.freshbin.pattern.bridge.myexample.skill;
/**
* 技能类一
*
* @author freshbin
* @date 2019年1月12日 下午8:30:15
*/
public class SkillOne implements HeroSkillInterface {
@Override
public void firstSkill() {
System.out.println("一Q一个队友!");
}
@Override
public void secondSkill() {
System.out.println("一W一群队友!");
}
}
package com.freshbin.pattern.bridge.myexample.skill;
/**
* 技能类二
*
* @author freshbin
* @date 2019年1月12日 下午8:30:15
*/
public class SkillTwo implements HeroSkillInterface {
@Override
public void firstSkill() {
System.out.println("一Q一个敌方英雄!");
}
@Override
public void secondSkill() {
System.out.println("一W一个五杀!");
}
}
英雄抽象类:
package com.freshbin.pattern.bridge.myexample.hero;
import com.freshbin.pattern.bridge.myexample.skill.HeroSkillInterface;
/**
* 游戏英雄接口
*
* @author freshbin
* @date 2019年1月12日 下午8:12:03
*/
public abstract class GameHero {
protected HeroSkillInterface heroSkill;
public GameHero(HeroSkillInterface heroSkill) {
this.heroSkill = heroSkill;
}
public abstract void heroFirstSkill();
public abstract void heroSecondSkill();
}
两个英雄类继承抽象类:
package com.freshbin.pattern.bridge.myexample.hero;
import com.freshbin.pattern.bridge.myexample.skill.HeroSkillInterface;
/**
* 亚瑟英雄
*
* @author freshbin
* @date 2019年1月12日 下午8:25:31
*/
public class YaSeHero extends GameHero {
public YaSeHero(HeroSkillInterface heroSkill) {
super(heroSkill);
System.out.println("这是亚瑟!");
}
@Override
public void heroFirstSkill() {
heroSkill.firstSkill();
}
@Override
public void heroSecondSkill() {
heroSkill.secondSkill();
}
}
package com.freshbin.pattern.bridge.myexample.hero;
import com.freshbin.pattern.bridge.myexample.skill.HeroSkillInterface;
/**
* 后羿英雄
*
* @author freshbin
* @date 2019年1月12日 下午8:25:31
*/
public class HouYiHero extends GameHero {
public HouYiHero(HeroSkillInterface heroSkill) {
super(heroSkill);
System.out.println("这是后羿!");
}
@Override
public void heroFirstSkill() {
heroSkill.firstSkill();
}
@Override
public void heroSecondSkill() {
heroSkill.secondSkill();
}
}
客户端主类:
package com.freshbin.pattern.bridge.myexample;
import com.freshbin.pattern.bridge.myexample.hero.GameHero;
import com.freshbin.pattern.bridge.myexample.hero.HouYiHero;
import com.freshbin.pattern.bridge.myexample.hero.YaSeHero;
import com.freshbin.pattern.bridge.myexample.skill.SkillOne;
import com.freshbin.pattern.bridge.myexample.skill.SkillTwo;
/**
* 桥接模式
*
* @author freshbin
* @date 2019年1月12日 下午8:04:57
*/
public class BridgePatternDemo {
public static void main(String[] args) {
GameHero yaSeHero = new YaSeHero(new SkillOne());
yaSeHero.heroFirstSkill();
yaSeHero.heroSecondSkill();
System.out.println("============");
GameHero houYiHero = new HouYiHero(new SkillTwo());
houYiHero.heroFirstSkill();
houYiHero.heroSecondSkill();
}
}
效果图:
最后是github代码:https://github.com/freshbin/designPattern