[关闭]
@yudesong 2018-02-12T02:52:52.000000Z 字数 4205 阅读 573

设计模式之结构型模式

设计模式


适配器模式

当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了,其主要作用就是在旧的接口、新的接口之间完成适配。

适配器模式的三个特点
  1. // 国标插头
  2. public interface CnPluginInterface {
  3. void chargeWith2Pins();
  4. }
  5. // 实现国标插座的充电方法
  6. public class CnPlugin implements CnPluginInterface {
  7. public void chargeWith2Pins() {
  8. System.out.println("charge with CnPlugin");
  9. }
  10. }
  11. // 在国家中内充电
  12. public class Home {
  13. private CnPluginInterface cnPlugin;
  14. public Home() { }
  15. public Home(CnPluginInterface cnPlugin) {
  16. this.cnPlugin = cnPlugin;
  17. }
  18. public void setPlugin(CnPluginInterface cnPlugin) {
  19. this.cnPlugin = cnPlugin;
  20. }
  21. // 充电
  22. public void charge() {
  23. // 国标充电
  24. cnPlugin.chargeWith2Pins();
  25. }
  26. }
  27. // 国标测试类
  28. public class CnTest {
  29. public static void main(String[] args) {
  30. CnPluginInterface cnPlugin = new CnPlugin();
  31. Home home = new Home(cnPlugin);
  32. // 会输出 “charge with CnPlugin”
  33. home.charge();
  34. }
  35. }
  36. // 英标插头
  37. public interface EnPluginInterface {
  38. void chargeWith3Pins();
  39. }
  40. // 实现英标插座的充电方法
  41. public class EnPlugin implements EnPluginInterface {
  42. public void chargeWith3Pins() {
  43. System.out.println("charge with EnPlugin");
  44. }
  45. }
  46. //适配器
  47. public class PluginAdapter implements CnPluginInterface {
  48. private EnPluginInterface enPlugin;
  49. public PluginAdapter(EnPluginInterface enPlugin) {
  50. this.enPlugin = enPlugin;
  51. }
  52. // 这是重点,适配器实现了英标的插头,然后重载国标的充电方法为英标的方法
  53. @Override
  54. public void chargeWith2Pins() {
  55. enPlugin.chargeWith3Pins();
  56. }
  57. }
  58. // 适配器测试类
  59. public class AdapterTest {
  60. public static void main(String[] args) {
  61. EnPluginInterface enPlugin = new EnPlugin();
  62. Home home = new Home();
  63. PluginAdapter pluginAdapter = new PluginAdapter(enPlugin);
  64. home.setPlugin(pluginAdapter);
  65. // 会输出 “charge with EnPlugin”
  66. home.charge();
  67. }
  68. }

装饰器

在装饰模式中的各个角色有
  1. // 抽象类 Girl
  2. public abstract class Girl {
  3. String description = "no particular";
  4. public String getDescription(){
  5. return description;
  6. }
  7. }
  8. // 美国女孩
  9. public class AmericanGirl extends Girl {
  10. public AmericanGirl() {
  11. description = "+AmericanGirl";
  12. }
  13. }
  14. // 国产妹子
  15. public class ChineseGirl extends Girl {
  16. public ChineseGirl() {
  17. description = "+ChineseGirl";
  18. }
  19. }
  20. // 装饰者
  21. public abstract class GirlDecorator extends Girl {
  22. public abstract String getDescription();
  23. }
  24. // 下面以美国女孩示例
  25. // 给美国女孩加上金发
  26. public class GoldenHair extends GirlDecorator {
  27. private Girl girl;
  28. public GoldenHair(Girl g) {
  29. girl = g;
  30. }
  31. @Override
  32. public String getDescription() {
  33. return girl.getDescription() + "+with golden hair";
  34. }
  35. }
  36. // 加上身材高大的特性
  37. public class Tall extends GirlDecorator {
  38. private Girl girl;
  39. public Tall(Girl g) {
  40. girl = g;
  41. }
  42. @Override
  43. public String getDescription() {
  44. return girl.getDescription() + "+is very tall";
  45. }
  46. }
  47. // 检验一下
  48. public class Test {
  49. public static void main(String[] args) {
  50. Girl g1 = new AmericanGirl();
  51. System.out.println(g1.getDescription());
  52. GoldenHair g2 = new GoldenHair(g1);
  53. System.out.println(g2.getDescription());
  54. Tall g3 = new Tall(g2);
  55. System.out.println(g3.getDescription());
  56. // 你也可以一步到位
  57. // Girl g = new Tall(new GoldenHair(new AmericanGirl()));
  58. }
  59. }

观察者

观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。

  1. // Subject 主题接口
  2. public interface Subject {
  3. public void registerObserver(Observer o);
  4. public void removeObserver(Observer o);
  5. public void notifyAllObservers();
  6. }
  7. // 观察者接口
  8. public interface Observer {
  9. public void update(Subject s);
  10. }
  11. // 视频网站某狐 实现 Subject 接口
  12. public class VideoSite implements Subject{
  13. // 观察者列表 以及 更新了的视频列表
  14. private ArrayList<Observer> userList;
  15. private ArrayList<String> videos;
  16. public VideoSite(){
  17. userList = new ArrayList<Observer>();
  18. videos = new ArrayList<String>();
  19. }
  20. @Override
  21. public void registerObserver(Observer o) {
  22. userList.add(o);
  23. }
  24. @Override
  25. public void removeObserver(Observer o) {
  26. userList.remove(o);
  27. }
  28. @Override
  29. public void notifyAllObservers() {
  30. for (Observer o: userList) {
  31. o.update(this);
  32. }
  33. }
  34. public void addVideos(String video) {
  35. this.videos.add(video);
  36. notifyAllObservers();
  37. }
  38. public ArrayList<String> getVideos() {
  39. return videos;
  40. }
  41. public String toString(){
  42. return videos.toString();
  43. }
  44. }
  45. // 实现观察者,即看视频的美剧迷们
  46. public class VideoFans implements Observer {
  47. private String name;
  48. public VideoFans(String name){
  49. this.name = name;
  50. }
  51. @Override
  52. public void update(Subject s) {
  53. System.out.println(this.name + ", new videos are available! ");
  54. // print video list
  55. System.out.println(s);
  56. }
  57. }
  58. // 测试一下
  59. public class Main {
  60. public static void main(String[] args) {
  61. VideoSite vs = new VideoSite();
  62. vs.registerObserver(new VideoFans("LiLei"));
  63. vs.registerObserver(new VideoFans("HanMeimei"));
  64. vs.registerObserver(new VideoFans("XiaoMing"));
  65. // add videos
  66. vs.addVideos("Video 1");
  67. //vs.addVideos("Video 2");
  68. }
  69. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注