回顧第一章JavaScript程式設計基礎知識
什麼是腳本?如何建立一段腳本
- 一段腳本是一系列計算機能夠遵循的指令,這些指令都是為了達成某個目标
- 腳本每次運作時,可能隻會執行全部指令中的一部分
- 計算機使用與人類不同的方式完成任務,是以指令必須讓計算機能過程式化地解決掉任務
- 要編寫一段腳本,你需要将目标分解成一系列的任務,然後分解成一個個的完成任務所需的步驟
計算機如何融入它周圍的世界中
- 計算機使用資料來為世界建立模型
如何為web頁面編寫一段腳本
- HTML是内容層
- CSS是展示層
- JavaScript是行為層
從HTML頁面連結一個JavaScript檔案
- 最好将JavaScript代碼放置到各自的JavaScript檔案中.JavaScript檔案都是文本檔案(如同HTML頁面和CSS樣式表檔案),但是JavaScript檔案有
擴充名js.
- HTML中的
元素用來在HTML頁面中高速浏覽器載入JavaScript檔案(類似于<script>
元素用來載入css檔案)<link>
- 如果在浏覽器中檢視頁面的源代碼,就會發現JavaScript不會修改HTML标記,這是因為腳本适合浏覽器建立的web浏覽器建立的web頁面的模型進行互動的
Java設計模式
通路者模式
通路者模式的結構
(屬于行為型模式)
- 抽象元素(
),也就是一個抽象類要有定義通路者的操作acceptElement
- 具體元素(
),Element的子類ConcreteElement
- 抽象通路者(
),一個接口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
裝飾模式
裝飾模式的結構
(屬于結構型模式)
- 裝飾元件(
):實質就是抽象類,其中定義了抽象方法.抽象元件就是"被裝飾者"角色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