天天看點

回顧JavaScript程式設計基礎知識/Java設計模式2

回顧第一章JavaScript程式設計基礎知識

什麼是腳本?如何建立一段腳本

  • 一段腳本是一系列計算機能夠遵循的指令,這些指令都是為了達成某個目标
  • 腳本每次運作時,可能隻會執行全部指令中的一部分
  • 計算機使用與人類不同的方式完成任務,是以指令必須讓計算機能過程式化地解決掉任務
  • 要編寫一段腳本,你需要将目标分解成一系列的任務,然後分解成一個個的完成任務所需的步驟

計算機如何融入它周圍的世界中

  • 計算機使用資料來為世界建立模型

如何為web頁面編寫一段腳本

  • HTML是内容層
  • CSS是展示層
  • JavaScript是行為層

從HTML頁面連結一個JavaScript檔案

  • 最好将JavaScript代碼放置到各自的JavaScript檔案中.JavaScript檔案都是文本檔案(如同HTML頁面和CSS樣式表檔案),但是JavaScript檔案有

    js.

    擴充名
  • HTML中的

    <script>

    元素用來在HTML頁面中高速浏覽器載入JavaScript檔案(類似于

    <link>

    元素用來載入css檔案)
  • 如果在浏覽器中檢視頁面的源代碼,就會發現JavaScript不會修改HTML标記,這是因為腳本适合浏覽器建立的web浏覽器建立的web頁面的模型進行互動的

Java設計模式

通路者模式

通路者模式的結構

回顧JavaScript程式設計基礎知識/Java設計模式2

(屬于行為型模式)

  • 抽象元素(

    Element

    ),也就是一個抽象類要有定義通路者的操作accept
  • 具體元素(

    ConcreteElement

    ),Element的子類
  • 抽象通路者(

    Visitor

    ),一個接口
  • 具體通路者(

    ConcreteVisitor

    ),實作

    Visitor

    接口的類

通路者模式使用了一種被稱為雙重分派的技術

通過簡單問題根據電表顯示用電量計算使用者的電費

首先設計一個抽象通路者也就是一個接口

package VisitorPatternTask;

public interface Visitor {  //抽象通路者(接口)
    public abstract double visit(AmmeterElement ammeterElement );     //用于通路抽象類資料的方法
}
           

其次設計一個抽象元素,也就是一個抽象類

package VisitorPatternTask;

public abstract class AmmeterElement {   //建立一個電表(抽象類)
    public abstract void accept(Visitor visitor);   //允許接口變量通路的方法(必須要有)
    public abstract void setElectricQuantity(double electricquantity);  //設定電量的抽象方法
    public abstract double showElectricQuantity();
}

           

然後添加具體通路者,也就是實作Visitor接口的類

package VisitorPatternTask;

public class FamilyMeterKeeper implements Visitor{ //建立實作通路者接口的類(家庭通路者)
    @Override
    public double visit(AmmeterElement ammeterElement) {
        double charge = 0;  //定義一個費用變量
        double unitOne = 0.5,unitTwo = 1;
        int basic = 5000;
        double value = ammeterElement.showElectricQuantity();   //抽象類的對象的方法
        if(value > basic){
            charge = (value-basic)*unitTwo + basic*unitOne;
        }
        else{
            charge = value*unitOne;
        }
        return charge;
    }
}

           
package VisitorPatternTask;

public class IndustrialSurveyor implements Visitor{
    @Override
    public double visit(AmmeterElement ammeterElement) {
        double charge = 0;  //定義一個費用變量
        double unitOne = 1.5,unitTwo = 2;
        int basic = 10000;
        double value = ammeterElement.showElectricQuantity();
        if(value > basic){
            charge = (value-basic)*unitTwo + basic*unitOne;
        }
        else{
            charge = value*unitOne;
        }
        return charge;
    }
}

           

最後再設計具體元素,也就是繼承抽象類的子類

package VisitorPatternTask;

public class Ammeter extends AmmeterElement {
    double electricQuantity;    //建立電表的電量
    @Override
    public void accept(Visitor visitor) {	//雙重分派技術 
        double charge = visitor.visit(this);    //讓通路者通路目前元素,this代表目前對象的
        System.out.println("目前電表使用者需要繳納的電費是:" + charge + "元");
    }
    @Override
    public void setElectricQuantity(double electricQuantity) {  //設定用電量
        this.electricQuantity = electricQuantity;
    }
    @Override
    public double showElectricQuantity() {  //傳回用電量
        return this.electricQuantity;
    }
}

           

建立一個主類進行測試

package VisitorPatternTask;

public class Application2 {
    public static void main(String[] args) {
        Visitor homeMan = new FamilyMeterKeeper();  //将家庭電表标準指派給接口變量
        Ammeter ammeter = new Ammeter();
        ammeter.setElectricQuantity(6000);
        ammeter.accept(homeMan);
        Visitor industryMan = new IndustrialSurveyor(); //工業标準
        ammeter.accept(industryMan);
    }
}

           

代碼結果

"D:\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=64701:D:\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\HelloWorld\out\production\HelloJava VisitorPatternTask.Application2
目前電表使用者需要繳納的電費是:3500.0元
目前電表使用者需要繳納的電費是:9000.0元

程序已結束,退出代碼 0

           

裝飾模式

裝飾模式的結構

回顧JavaScript程式設計基礎知識/Java設計模式2

(屬于結構型模式)

  • 裝飾元件(

    Component

    ):實質就是抽象類,其中定義了抽象方法.抽象元件就是"被裝飾者"角色
  • 具體元件(

    ConcreteComponent

    ):抽象元件的一個子類
  • 裝飾(

    Decorate

    ):也是抽象元件的一個子類,可以是抽象子類也可以是非抽象子類
  • 具體裝飾者(

    ConcreteDecorate

    ):裝飾的一個子類,是非抽象類

實際例子

首先建立一個抽象元件,也就是抽象類

package DecoratorPatternTask;

public abstract class Bird {    //建立一個抽象元件
    public abstract int fly();  //抽象方法
}

           

然後建立一個具體元件,也就是抽象元件的子類

package DecoratorPatternTask;

public class Sparrow extends Bird{      //具體元件
    public final int Distance = 100;    //飛行距離
    @Override
    public int fly() {      //重寫父類抽象方法傳回飛行距離
        return Distance;
    }
}

           

其次建立裝飾,也就是抽象元件的子類,可以比喻成裝修公司

其作用是裝飾具體元件,

package DecoratorPatternTask;

public abstract class Decorator extends Bird{   //繼承bird的抽象子類(也就是裝飾),相當于裝修公司
    Bird bird;  //聲明一個父類元素的變量
    public Decorator(){
    }
    public Decorator(Bird bird){    //自定義構造方法,擷取bird的引用
        this.bird = bird;
    }
    public abstract int eleFly();   //用于裝飾fly()的方法,行為有具體裝飾者實作
}

           

然後建立具體裝飾,也就是裝飾的子類(非抽象類),也就是建立裝修公司裡的員工

package DecoratorPatternTask;

public class SparrowDecorator extends Decorator{    //裝飾的子類,相當于裝修員工
    public final int Distance = 50;
    public  SparrowDecorator(Bird bird){    //關鍵之處
        super(bird);    //調用父類的構造方法 父類的bird
    }
    @Override
    public int eleFly() {
        return Distance;
    }
    @Override
    public int fly() {
        int Distance = 0;   //聲明一個變量距離
        Distance = bird.fly() + eleFly();
        return Distance;
    } //
}

           

除此之外還可以使用多個裝飾者,也就是公司裡的其他裝修員工

package DecoratorPatternTask;

public class SparrowDecorator2 extends Decorator {
    final int Distance = 1000;
    public SparrowDecorator2(){
    }
    public SparrowDecorator2(Bird bird){    //自定義構造方法
        super(bird);    //調用父類構造方法
    }
    @Override
    public int eleFly() {
        return Distance;
    }
    @Override
    public int fly() {
        int Distance = 0;
        Distance = bird.fly() + eleFly();
        return Distance;
    }
}

           

最後可以進行調試

package DecoratorPatternTask;

public class Application3 {
    public static void main(String[] args) {
        Bird bird = new Sparrow();  //将子類引用傳給父類變量,即父類變量成為上轉型對象
        System.out.println("沒有安裝電子翅膀小鳥的飛行距離為:\n" + bird.fly() + "米");
        bird = new SparrowDecorator(bird);  //相當于沒有安裝電子翅膀的小鳥的引用傳給裝修人員
        System.out.println("安裝了電子翅膀小鳥的飛行距離為:\n" + bird.fly() + "米" );
        bird = new SparrowDecorator(bird);
        System.out.println("再安裝一次電子翅膀小鳥的飛行距離為:\n" + bird.fly() + "米");
        bird = new SparrowDecorator2(bird);
        System.out.println("安裝超級電子翅膀小鳥的飛行距離為:\n" + bird.fly() + "米");
    }
}

           

運作的結果是

"D:\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=55757:D:\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\HelloWorld\out\production\HelloJava DecoratorPatternTask.Application3
沒有安裝電子翅膀小鳥的飛行距離為:
100米
安裝了電子翅膀小鳥的飛行距離為:
150米
再安裝一次電子翅膀小鳥的飛行距離為:
200米
安裝超級電子翅膀小鳥的飛行距離為:
1200米

程序已結束,退出代碼 0

           

CET4P146

occur

nuisance

democracy

scenery

average

thermometer

slap

obstacle

terror

worthwhile

significance

繼續閱讀