@yudesong
2018-02-12T02:52:52.000000Z
字数 4205
阅读 573
设计模式
当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了,其主要作用就是在旧的接口、新的接口之间完成适配。
// 国标插头public interface CnPluginInterface {void chargeWith2Pins();}// 实现国标插座的充电方法public class CnPlugin implements CnPluginInterface {public void chargeWith2Pins() {System.out.println("charge with CnPlugin");}}// 在国家中内充电public class Home {private CnPluginInterface cnPlugin;public Home() { }public Home(CnPluginInterface cnPlugin) {this.cnPlugin = cnPlugin;}public void setPlugin(CnPluginInterface cnPlugin) {this.cnPlugin = cnPlugin;}// 充电public void charge() {// 国标充电cnPlugin.chargeWith2Pins();}}// 国标测试类public class CnTest {public static void main(String[] args) {CnPluginInterface cnPlugin = new CnPlugin();Home home = new Home(cnPlugin);// 会输出 “charge with CnPlugin”home.charge();}}// 英标插头public interface EnPluginInterface {void chargeWith3Pins();}// 实现英标插座的充电方法public class EnPlugin implements EnPluginInterface {public void chargeWith3Pins() {System.out.println("charge with EnPlugin");}}//适配器public class PluginAdapter implements CnPluginInterface {private EnPluginInterface enPlugin;public PluginAdapter(EnPluginInterface enPlugin) {this.enPlugin = enPlugin;}// 这是重点,适配器实现了英标的插头,然后重载国标的充电方法为英标的方法@Overridepublic void chargeWith2Pins() {enPlugin.chargeWith3Pins();}}// 适配器测试类public class AdapterTest {public static void main(String[] args) {EnPluginInterface enPlugin = new EnPlugin();Home home = new Home();PluginAdapter pluginAdapter = new PluginAdapter(enPlugin);home.setPlugin(pluginAdapter);// 会输出 “charge with EnPlugin”home.charge();}}
抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
// 抽象类 Girlpublic abstract class Girl {String description = "no particular";public String getDescription(){return description;}}// 美国女孩public class AmericanGirl extends Girl {public AmericanGirl() {description = "+AmericanGirl";}}// 国产妹子public class ChineseGirl extends Girl {public ChineseGirl() {description = "+ChineseGirl";}}// 装饰者public abstract class GirlDecorator extends Girl {public abstract String getDescription();}// 下面以美国女孩示例// 给美国女孩加上金发public class GoldenHair extends GirlDecorator {private Girl girl;public GoldenHair(Girl g) {girl = g;}@Overridepublic String getDescription() {return girl.getDescription() + "+with golden hair";}}// 加上身材高大的特性public class Tall extends GirlDecorator {private Girl girl;public Tall(Girl g) {girl = g;}@Overridepublic String getDescription() {return girl.getDescription() + "+is very tall";}}// 检验一下public class Test {public static void main(String[] args) {Girl g1 = new AmericanGirl();System.out.println(g1.getDescription());GoldenHair g2 = new GoldenHair(g1);System.out.println(g2.getDescription());Tall g3 = new Tall(g2);System.out.println(g3.getDescription());// 你也可以一步到位// Girl g = new Tall(new GoldenHair(new AmericanGirl()));}}
观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。
// Subject 主题接口public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyAllObservers();}// 观察者接口public interface Observer {public void update(Subject s);}// 视频网站某狐 实现 Subject 接口public class VideoSite implements Subject{// 观察者列表 以及 更新了的视频列表private ArrayList<Observer> userList;private ArrayList<String> videos;public VideoSite(){userList = new ArrayList<Observer>();videos = new ArrayList<String>();}@Overridepublic void registerObserver(Observer o) {userList.add(o);}@Overridepublic void removeObserver(Observer o) {userList.remove(o);}@Overridepublic void notifyAllObservers() {for (Observer o: userList) {o.update(this);}}public void addVideos(String video) {this.videos.add(video);notifyAllObservers();}public ArrayList<String> getVideos() {return videos;}public String toString(){return videos.toString();}}// 实现观察者,即看视频的美剧迷们public class VideoFans implements Observer {private String name;public VideoFans(String name){this.name = name;}@Overridepublic void update(Subject s) {System.out.println(this.name + ", new videos are available! ");// print video listSystem.out.println(s);}}// 测试一下public class Main {public static void main(String[] args) {VideoSite vs = new VideoSite();vs.registerObserver(new VideoFans("LiLei"));vs.registerObserver(new VideoFans("HanMeimei"));vs.registerObserver(new VideoFans("XiaoMing"));// add videosvs.addVideos("Video 1");//vs.addVideos("Video 2");}}