1.觀察者模式

            有兩個(gè)角色,觀察者和被觀察者。當(dāng)被觀察者發(fā)出消息后,注冊(cè)了的觀察者會(huì)收到其消息,而沒有注冊(cè)的觀察者就不會(huì)收到。
          //定義觀察者接口 interface Observer{ //通知觀察者 void notify(String message); } //定義被觀察者
          interface Observed{ //注冊(cè)觀察者 void registerObserver(Observer o); //移除觀察者 void
          removeObserver(Observer o);//通知觀察者 void notifyObserver(); } //實(shí)現(xiàn)一個(gè)被觀察者(女神) class
          Grilimplements Observed{ //女神最近的消息 private String message; //追求女神的人
          List<Observer> observerList; public Gril(){ observerList=new ArrayList<>(); }
          @Overridepublic void registerObserver(Observer o) { //多了一位追求者
          observerList.add(o); } @Overridepublic void removeObserver(Observer o) { //
          一位勇士放棄了 observerList.remove(o); } @Override public void notifyObserver() { //
          女神發(fā)出了一點(diǎn)消息 for(Observer o:observerList){ o.notify(message); } } public void
          setMeesage(String message){this.message=message; } } //實(shí)現(xiàn)觀察者 class Handsome_Boy
          implements Observer{ @Override public void notify(String message) {
          System.out.println("隔壁班帥哥收到消息:"+message); } } class Lao_Wang implements
          Observer{ @Overridepublic void notify(String message) { System.out.println(
          "老王收到消息:"+message); } } class Gay implements Observer{ @Override public void
          notify(String message) { System.out.println("小伙汁收到消息:"+message); } } //測(cè)試使用
          public class observer_test { public static void main(String[] args) { //
          首先創(chuàng)建幾個(gè)觀察者和被觀察者 Gril gril=new Gril(); Handsome_Boy boy=new Handsome_Boy(); Gay
          gay=new Gay(); Lao_Wang wang=new Lao_Wang(); //注冊(cè)觀察者
          gril.registerObserver(boy); gril.registerObserver(wang);//被觀察者發(fā)出通知
          gril.setMeesage("我好無聊啊"); gril.notifyObserver(); } }
            Netty中的應(yīng)用:NioSocketChannel.writeAndFlush()。

          2.責(zé)任鏈模式

            責(zé)任鏈模式,讓多個(gè)對(duì)象都有可能處理同一個(gè)請(qǐng)求,把多個(gè)對(duì)象連成一條鏈,讓事件在這條鏈上傳播,并且鏈上每個(gè)節(jié)點(diǎn)都可以終止傳播
          。熟悉Netty的朋友一定了解過這種設(shè)計(jì)模式,pipeline就像一個(gè)責(zé)任鏈,ChannelHandler就是其中處理邏輯的節(jié)點(diǎn)。
          //創(chuàng)建一個(gè)邏輯處理器的抽象類 abstract class AbstractHandler { //下一個(gè)邏輯處理器,如果你想雙向傳播,還可以定義一個(gè)前節(jié)點(diǎn)
          AbstractHandler nextHandler;//執(zhí)行事件并往下傳播 public void Execute(String message) {
          write(message);    //可以加上其他條件,終止傳播 if (nextHandler != null)
          nextHandler.Execute(message); }//設(shè)置下一個(gè)邏輯處理器 public void
          setNextHandler(AbstractHandler handler) {this.nextHandler = handler; } //
          實(shí)際的邏輯方法,需要具體的邏輯處理器去實(shí)現(xiàn) abstract void write(String message); } //邏輯處理器A class
          HandlerAextends AbstractHandler { //實(shí)際的邏輯代碼 @Override void write(String
          message) { System.out.println("邏輯處理器A執(zhí)行:" + message); } } //邏輯處理器B class
          HandlerBextends AbstractHandler { @Override void write(String message) {
          System.out.println("邏輯處理器B執(zhí)行:" + message); } } //邏輯處理器C class HandlerC extends
          AbstractHandler { @Overridevoid write(String message) { System.out.println(
          "邏輯處理器C執(zhí)行:" + message); } } //測(cè)試使用 public class Chain_ResponsibilityTest {
          public static void main(String[] args) { //首先創(chuàng)建邏輯處理器對(duì)象 AbstractHandler a = new
          HandlerA(); AbstractHandler b= new HandlerB(); AbstractHandler c = new
          HandlerC();//把多個(gè)對(duì)象連成一條鏈 a.setNextHandler(b); b.setNextHandler(c); //從頭節(jié)點(diǎn)開始執(zhí)行
          a.Execute("你好"); } }
            最后ABC會(huì)按照鏈表順序輸出你好。

          ?

          3.單例模式

            單例模式的特點(diǎn)是一個(gè)類全局只有一個(gè)變量,創(chuàng)建時(shí)是線程安全的。
            常見單例模式實(shí)現(xiàn)的代碼:
          public class Singleton { private static Singleton singleton; private
          Singleton(){}public static Singleton getInstance(){ if(singleton==null){
          synchronized (Singleton.class){ if(singleton==null) singleton=new Singleton();
          } }return singleton; } }
            
          重點(diǎn)在于私有化構(gòu)造函數(shù),然后定義一個(gè)私有的靜態(tài)全局變量,用以存儲(chǔ)當(dāng)前類的實(shí)例。向外提供一個(gè)獲取實(shí)例的方法,如果當(dāng)前實(shí)例變量不為空,說明已經(jīng)實(shí)例化過,就直接返回。否則就進(jìn)行實(shí)例化,為了防止多個(gè)線程同時(shí)進(jìn)入if里面重復(fù)實(shí)例化,所以得加上synchronized。

            另外,單例模式還有懶漢、餓漢之分。上面的代碼就是一個(gè)懶漢單例模式,即獲取實(shí)例時(shí)才去創(chuàng)建,這和Netty中的延遲加載是一個(gè)思想。而餓漢就是,定義實(shí)例變量時(shí)直接實(shí)例化了,同樣要私有化構(gòu)造函數(shù),之后獲取實(shí)例的方法直接返回這個(gè)變量就行。
            單例模式在Netty中的應(yīng)用:ReadTimeoutException等。

          ?

          4.策略模式

           
           簡(jiǎn)答地說,一個(gè)類的行為或算法可以在運(yùn)行時(shí)更改,這就策略模式。當(dāng)一個(gè)類需要根據(jù)運(yùn)行時(shí)的數(shù)據(jù),自動(dòng)去選擇執(zhí)行什么邏輯,這時(shí)候我們就可以用上策略模式。下面來簡(jiǎn)單實(shí)現(xiàn)一下:
          //定義一個(gè)行為接口 interface Calculate{ int operation(int num1,int num2); } //
          繼承行為接口,實(shí)現(xiàn)具體的行為或算法 class StrategyAdd implements Calculate{ @Override public int
          operation(int num1,int num2) { return num1+num2; } } class StrategyMultiply
          implements Calculate{ @Override public int operation(int num1, int num2) {
          return num1*num2; } } //封裝一個(gè)供外部使用的類 class Use{ private Calculate calculate; //
          接收的參數(shù)是那個(gè)父接口,這樣實(shí)現(xiàn)了這個(gè)接口的類都可以傳遞進(jìn)來 public Use(Calculate calculate){ this.calculate=
          calculate; }public int execute(int num1,int num2){ //執(zhí)行實(shí)際傳遞進(jìn)來的類的operation方法
          return calculate.operation(num1,num2); } } public class Strategy { //測(cè)試使用 public
          static void main(String[] args) { //
          假設(shè)這不是main方法,只是實(shí)際項(xiàng)目中的一個(gè)普通方法,args是用戶或其他路徑傳入的一個(gè)參數(shù)//根據(jù)自己的實(shí)際需求甄別參數(shù),選擇具體行為 if
          (args.length==0){ Use use=new Use(new StrategyAdd());
          System.out.println(use.execute(5,5));//10 }else { Use use1=new Use(new
          StrategyMultiply()); System.out.println(use1.execute(5,5));//25 } } }
            Netty中的應(yīng)用:DefaultEventExecutorChooserFactor-newChooser

          ?

          5.裝飾者模式

            
          不需要修改原有類的代碼,就可以對(duì)這個(gè)類的對(duì)象附加其他效果。當(dāng)要拓展一個(gè)類的功能時(shí)就可以使用這種設(shè)計(jì)模式。但這種設(shè)計(jì)模式的缺點(diǎn)也非常明顯,會(huì)有額外的代碼,當(dāng)繼承的層級(jí)多了以后,邏輯也更復(fù)雜。
          //定義一個(gè)基礎(chǔ)接口,獲取商品價(jià)格 interface Goods{ float getPrice(); } //實(shí)現(xiàn)一個(gè)汽車商品,獲取價(jià)格(原型)
          class Car implements Goods{ private float Price; public Car(float price){ this
          .Price=price; } @Override public float getPrice() { return Price; } } //
          裝飾者的父類,集中它們的優(yōu)惠效果。如何集中的,關(guān)鍵在于裝飾類獲取價(jià)格方法時(shí)調(diào)用了父類的get方法。//
          可以調(diào)試捋一捋,最終的價(jià)格計(jì)算其實(shí)是在打折時(shí)才開始一層層往上計(jì)算的 class On_Sale implements Goods{ private Goods
          goods;public On_Sale(Goods goods){ this.goods=goods; } @Override public float
          getPrice() {return this.goods.getPrice(); } } //汽車立減優(yōu)惠(裝飾者類,原型附加功能) class
          Car_Knockextends On_Sale{ //立減金額 private float amount; public Car_Knock(float
          amount,Goods goods){super(goods); this.amount=amount; } @Override public float
          getPrice() {return super.getPrice()-amount; } } //汽車打折優(yōu)惠 class Car_Discount
          extends On_Sale{ //打折多少 private int discount; public Car_Discount(int
          discount,Goods goods){super(goods); this.discount=discount; } @Override public
          float getPrice() { return super.getPrice()*discount/10; } } //測(cè)試使用 public class
          decorator {public static void main(String[] args) { //創(chuàng)建一個(gè)原型,并傳入價(jià)格 Goods goods=
          new Car(120000); //當(dāng)立減1000后 goods=new Car_Knock(1000,goods); //在立減基礎(chǔ)上再打個(gè)8折
          goods=new Car_Discount(8,goods); System.out.println(goods.getPrice()); } }
           
           Netty中的應(yīng)用:WrappedByteBuf、UnreleasableByteBuf、SimpleLeakAwareByteBuf。第一個(gè)類就相當(dāng)于裝飾者父類,后兩個(gè)就是裝飾類,而ByteBuf就是原型。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                撕开丰满老师的黑色丝袜视频 | 国产精品乱伦视频 | www爱爱 | 日日骚网| 强嗯~受~噗嗤~啊~H视频 |