筆記20200515:多線程【靜態代理模式】

①設計模式:
  • 真實角色
  • 代理角色:持有真實角色的引用
  • 兩者實現相同的接口
  • package com.chengguo.線程;
    
    /**
     * 靜態代理設計模式:
     * ①真實角色
     * ②代理角色:持有真實角色的引用
     * ③兩者實現相同接口
     */
    public class Demo_20200509005_StaticProxy {
        public static void main(String[] args) {
    //        WeddingCompany wc = new WeddingCompany(new You());
    //        wc.HappyMarry();
            //建立真實角色(可使用接口)
            Marry you = new You();
            //建立代理角色(可使用接口),加入真實角色的引用
            Marry weddingCompany = new WeddingCompany(you);
            //執行
            weddingCompany.HappyMarry();
        }
    }
    
    //③兩者實現相同接口
    interface Marry {
        //久旱逢甘露
        //他鄉遇故知
        //洞房花燭夜
        //金榜題名時
        void HappyMarry();
    }
    
    //①真實角色
    class You implements Marry {
        //重寫接口方法
        @Override
        public void HappyMarry() {
    
            System.out.println("新郎官結婚咯");
        }
    }
    
    //②代理角色
    class WeddingCompany implements Marry {
        private Marry you;
    
        //無參構造
        public WeddingCompany() {
        }
    
        //帶參構造
        public WeddingCompany(Marry you) {
    
            this.you = you;
        }
    
        //重寫接口方法
        @Override
        public void HappyMarry() {
            before();
            this.you.HappyMarry();
            after();
    
        }
    
        //結婚以後
        private void after() {
            System.out.println("結婚以後--->收尾款");
        }
    
        //結婚以前
        private void before() {
            System.out.println("結婚以前--->佈置現場");
        }
    }

    靜態代理+線程模擬12306搶票實現設計模式

  • package com.chengguo.線程;
    
    /**
     * 多個線程同時操做同一個對象:買火車票的例子
     */
    public class Demo_20200509002_Thread implements Runnable {
        //定義火車票默認張數
        private int ticketNums = 10;
    
        @Override
        public void run() {
            while (true) {
                if (ticketNums <= 0) {
                    break;
                } else {
    
                    try {
                        //模擬延時
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    //獲取當前票的名字:Thread.currentThread().getName();每搶一張票就--
                    System.out.println(Thread.currentThread().getName() + "搶到了第" + ticketNums-- + "張票");
                }
    
            }
    
        }
    
        public static void main(String[] args) {
            //建立runnable接口的實現類對象(真實角色)
            Demo_20200509002_Thread dt1 = new Demo_20200509002_Thread();
            //建立一個線程對象,經過線程對象來開啓線程(代理角色:持有真實角色的引用)
    //        Thread thread1 = new Thread(dt1, "路人甲");
    //        thread1.start();
    //        Thread thread2 = new Thread(dt1, "路人乙");
    //        thread2.start();
    //        Thread thread3 = new Thread(dt1, "路人丙");
    //        thread3.start();
    
    //        優化代碼
            new Thread(dt1, "路人甲").start();
            new Thread(dt1, "路人乙").start();
            new Thread(dt1, "路人丙").start();
        }
    }

    總結app

相關文章
相關標籤/搜索