暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

java设计模式——结构型模式(二)

Hello 帅帅 2021-02-05
531

外观模式

例:定义一个动物接口,猫狗鱼实现该接口,并有购买方法,超市类,该类在构造时便创建了之前动物类的对象,并且可以调用动物类的方法。


Animal

     public interface Animal {
    void buy();
    }

    Cat

       public class Cat implements Animal{
      public void buy(){
      System.out.println("你买了一只猫");
      }
      }

      Dog

         public class Dog implements Animal{
        public void buy() {
        System.out.println("你买了一条狗");
        }
        }

        Fish

           public class Fish implements Animal {
          public void buy(){
          System.out.println("你买了鱼老师");
          }
          }

          Market

             public class Market {
            private final Cat cat;
            private final Dog dog;
            private final Fish fish;

            public Market() {
            cat = new Cat();
            dog = new Dog();
            fish = new Fish();
            }


            public void buyCat() {
            cat.buy();
            }

            public void buyDog() {
            dog.buy();
            }

            public void buyFish() {
            fish.buy();
            }
            }

            Test

               public class Test {
              public static void main(String[] args) {
              Market m=new Market();

              m.buyCat();
              m.buyDog();
              m.buyFish();
              }
              }

              享元模式

              例:MyBook实现book接口,有属性name。Bookcase有获取书籍方法,如果书架中有相应书籍,则返回相应hashmap中相应书籍,如果没有相应书籍,则new一个MyBook对象,并将其加入到hashmap中

              Book

                 public interface Book {
                void look();
                }

                Bookcase

                   public class Bookcase {
                  Map<String, MyBook> m = new HashMap<>();

                  public Book getBook(String name) {
                  if (!m.containsKey(name)) {
                  m.put(name, new MyBook(name));
                  }
                  return (Book) m.get(name);
                  }

                  public int count(){
                  return m.size();
                  }
                  }

                  MyBook

                     public class MyBook implements Book {
                    private final String name;

                    public MyBook(String name) {
                    this.name = name;
                    }

                    @Override
                    public void look() {
                    System.out.println("你正在看书:" + name);
                    }
                    }

                    Test

                       public class Test {
                      public static void main(String[] args) {
                      Bookcase bookcase = new Bookcase();

                      bookcase.getBook("三国演义");
                      bookcase.getBook("三国演义");
                      bookcase.getBook("三国演义");
                      bookcase.getBook("三国演义");

                      bookcase.getBook("水浒传");
                      bookcase.getBook("水浒传");
                      bookcase.getBook("水浒传");
                      bookcase.getBook("水浒传");

                      System.out.println(bookcase.count());
                      }
                      }

                      代理模式

                      例:代理图片与真实图片实现图片接口,真实图片在创建时,会在内存中加载,代理图片在加载时,如果之前加载过,则不会消耗时间在内存中加载。Image

                         public interface Image {
                        void display();
                        }

                        ProxyImage

                           public class ProxyImage implements Image {

                          private final String name;
                          private RealImage realImage;

                          public ProxyImage(String name) {
                          this.name = name;
                          }

                          @Override
                          public void display() {
                          if (realImage == null) {
                          realImage = new RealImage(this.name);
                          }
                          realImage.display();
                          }
                          }

                          RealImage

                             public class RealImage implements Image {

                            private final String name;

                            public RealImage(String name) {
                            this.name = name;
                            load();
                            }

                            private void load() {
                            System.out.println("加载图像,消耗两秒");
                            try {
                            Thread.sleep(2000);
                            } catch (InterruptedException e) {
                            e.printStackTrace();
                            }
                            }

                            @Override
                            public void display() {
                            System.out.println("显示图片");
                            }
                            }

                            Test

                               public class Test {
                              public static void main(String[] args) {
                              Image image1 = new ProxyImage("图片1");

                              image1.display();
                              image1.display();
                              image1.display();
                              image1.display();
                              }
                              }



                              文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论