国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

怎么創(chuàng)建網(wǎng)站 免費(fèi)的官網(wǎng)設(shè)計(jì)公司

怎么創(chuàng)建網(wǎng)站 免費(fèi)的,官網(wǎng)設(shè)計(jì)公司,旅游公司網(wǎng)站建設(shè),wordpress 添加表單文章目錄 前言一、命令模式二、訪問者模式三、迭代器模式 前言 本篇是關(guān)于設(shè)計(jì)模式中命令模式、訪問者模式、以及迭代器模式的學(xué)習(xí)筆記。 一、命令模式 命令模式是一種行為型設(shè)計(jì)模式,其核心目的在于將命令的發(fā)送者和接受者解耦,提供一個(gè)中間層對(duì)命令進(jìn)行…

文章目錄

  • 前言
  • 一、命令模式
  • 二、訪問者模式
  • 三、迭代器模式


前言

??本篇是關(guān)于設(shè)計(jì)模式中命令模式、訪問者模式、以及迭代器模式的學(xué)習(xí)筆記。


一、命令模式

??命令模式是一種行為型設(shè)計(jì)模式,其核心目的在于將命令的發(fā)送者和接受者解耦,提供一個(gè)中間層對(duì)命令進(jìn)行統(tǒng)一的管理,請(qǐng)求的發(fā)送者不需要知道接收者的具體實(shí)現(xiàn),而只需依賴一個(gè)抽象的命令接口。
??命令模式通常包括以下的角色:

  • 抽象/接口命令層:定義了執(zhí)行命令的抽象方法,例如執(zhí)行,撤銷。
  • 具體命令類:繼承/實(shí)現(xiàn)了命令層,對(duì)命令的具體內(nèi)容做一個(gè)描述。
  • 接收者:實(shí)際執(zhí)行操作的對(duì)象,包含與請(qǐng)求相關(guān)的邏輯。
  • 調(diào)用者:調(diào)用命令對(duì)象以觸發(fā)請(qǐng)求的執(zhí)行。
  • 客戶端:創(chuàng)建具體的命令對(duì)象,并將其綁定到調(diào)用者上。

??舉一個(gè)生活中的案例,假設(shè)對(duì)于家電,想要通過一個(gè)萬能遙控器去控制某個(gè)家電的開/關(guān),而不需要每個(gè)家電都配一個(gè)遙控器,則可以將開,關(guān)設(shè)為具體命令類:

/*** 命令抽象類*/
public interface Command {/*** 執(zhí)行命令*/void execute();/*** 回滾操作*/void undo();
}

??以對(duì)燈的開關(guān)操作為例,開燈的命令類:

/*** 開燈*/
public class LightOnCommand implements Command{private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}@Overridepublic void undo() {light.off();}
}

??關(guān)燈的命令類:

/*** 關(guān)燈*/
public class LightOffCommand implements Command{private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.off();}@Overridepublic void undo() {light.on();}
}

??具體的電器,有開關(guān)的操作。

public class Light {public void on(){System.out.println("把燈打開");}public void off(){System.out.println("關(guān)燈了");}
}

??以及一個(gè)空的命令類

public class NoCommand implements Command{/*** 執(zhí)行命令*/@Overridepublic void execute() {}/*** 回滾操作*/@Overridepublic void undo() {}
}

??命令的統(tǒng)一管理類,主要作用:

  • 對(duì)命令組進(jìn)行初始化。
  • 設(shè)置操控某一個(gè)對(duì)象的具體命令。
  • 執(zhí)行具體的命令。
  • 撤銷命令。
public class RemoteController {//存放各種設(shè)備的開命令Command[] onCommands;//存放各種設(shè)備的關(guān)命令Command[] offCommands;//撤銷的命令Command unCommand;/*** 初始化空命令*/public RemoteController(int number) {onCommands = new Command[number];offCommands = new Command[number];for (int i = 0; i < number; i++) {onCommands[i] = new NoCommand();offCommands[i] = new NoCommand();}}/*** 設(shè)置具體的命令** @param no         設(shè)備組編號(hào)* @param onCommand  具體設(shè)備組設(shè)備的開命令* @param offCommand 具體設(shè)備組設(shè)備的關(guān)命令*/public void setCommand(int no, Command onCommand, Command offCommand) {onCommands[no] = onCommand;offCommands[no] = offCommand;}/*** 按下某個(gè)設(shè)備的開按鈕** @param no 設(shè)備組編號(hào)*/public void onButtonWasPushed(int no) {onCommands[no].execute();//記錄本次操作,便于撤銷unCommand = onCommands[no];}/*** 按下某個(gè)設(shè)備的關(guān)按鈕** @param no 設(shè)備組編號(hào)*/public void offButtonWasPushed(int no) {offCommands[no].execute();//記錄本次操作,便于撤銷unCommand = offCommands[no];}/*** 撤銷*/public void undo() {unCommand.undo();}
}

??客戶端:

public class Client {public static void main(String[] args) {Light light = new Light();//初始化開啟電燈命令LightOnCommand lightOnCommand = new LightOnCommand(light);//初始化關(guān)閉電燈命令LightOffCommand lightOffCommand = new LightOffCommand(light);//初始化遙控器面板RemoteController remoteController = new RemoteController(5);remoteController.setCommand(0, lightOnCommand, lightOffCommand);System.out.println("--------開啟電燈--------");remoteController.onButtonWasPushed(0);System.out.println("--------關(guān)閉電燈--------");remoteController.offButtonWasPushed(0);System.out.println("--------撤銷上一步操作--------");remoteController.undo();}
}

??如果需要進(jìn)行擴(kuò)展,比如電視,只需要去增加一個(gè)電視機(jī)對(duì)象,以及兩個(gè)實(shí)現(xiàn)了命令接口的具體命令類,最后在客戶端進(jìn)行初始化即可,無需對(duì)命令管理類進(jìn)行修改。

二、訪問者模式

??訪問者模式是一種行為型設(shè)計(jì)模式,主要用來將操作與對(duì)象結(jié)構(gòu)分離。核心思想在不修改對(duì)象結(jié)構(gòu)的前提下,定義作用于這些對(duì)象的新操作。
??訪問者模式通過引入一個(gè)訪問者對(duì)象,將對(duì)結(jié)構(gòu)中各個(gè)元素的操作從元素類中抽離出來。這樣,當(dāng)需要添加新操作時(shí),無需修改元素類,而只需添加新的訪問者類,訪問者模式由以下幾個(gè)角色組成:

  • 訪問者接口:聲明對(duì)每種元素類型的訪問操作方法。
  • 具體訪問者:實(shí)現(xiàn)訪問者接口,定義具體的操作邏輯。
  • 元素接口:定義接受訪問者對(duì)象的方法。
  • 具體元素:實(shí)現(xiàn)元素接口,在接受訪問者對(duì)象的方法中調(diào)用訪問者的相應(yīng)方法。
  • 對(duì)象結(jié)構(gòu):包含一組元素,可以遍歷這些元素并讓訪問者訪問它們。

??舉一個(gè)生活中的案例,例如在網(wǎng)上商城將商品加入購物車,需要計(jì)算商品總價(jià),還需要獲取商品的詳細(xì)清單,利用訪問者模式,可以將商品作為被訪問的類

/*** 被訪問的元素接口*/
public interface Item {void accept(Visitor visitor);
}
/*** 被訪問的元素:書籍*/
public class Book implements Item {private String title;private double price;public Book(String title, double price) {this.title = title;this.price = price;}public String getTitle() {return title;}public double getPrice() {return price;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}
/*** 被訪問的元素:電子產(chǎn)品*/
public class Electronic implements Item {private String name;private double price;public Electronic(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}

??定義一個(gè)訪問者接口層,訪問具體的商品(書籍,電子產(chǎn)品):

public interface Visitor {void visit(Book book);void visit(Electronic electronic);
}

??定義計(jì)算價(jià)格和打印清單具體的行為:

/*** 打印清單*/
public class ItemPrinterVisitor implements Visitor {@Overridepublic void visit(Book book) {System.out.println("Book: " + book.getTitle() + " - Price: " + book.getPrice());}@Overridepublic void visit(Electronic electronic) {System.out.println("Electronic: " + electronic.getName() + " - Price: " + electronic.getPrice());}
}
/*** 計(jì)算書籍和電子產(chǎn)品的價(jià)格*/
public class PriceCalculatorVisitor implements Visitor{private double totalPrice = 0;@Overridepublic void visit(Book book) {totalPrice = totalPrice+book.getPrice();}@Overridepublic void visit(Electronic electronic) {totalPrice = totalPrice + electronic.getPrice();}public double getTotalPrice(){return totalPrice;}
}

??以及具體的對(duì)象接口,讓訪問者去操作書籍和電子產(chǎn)品:

/*** 對(duì)象接口*/
public class ShoppingCart {private List<Item> items = new ArrayList<>();public void addItem(Item item) {items.add(item);}public void accept(Visitor visitor) {for (Item item : items) {item.accept(visitor);}}
}

??客戶端:

public class Client {public static void main(String[] args) {// 創(chuàng)建購物車ShoppingCart cart = new ShoppingCart();cart.addItem(new Book("Spring源碼深度解析", 50));cart.addItem(new Electronic("Iphone17", 6300));// 計(jì)算總價(jià)PriceCalculatorVisitor priceCalculator = new PriceCalculatorVisitor();cart.accept(priceCalculator);System.out.println("Total Price: " + priceCalculator.getTotalPrice());// 打印清單ItemPrinterVisitor itemPrinter = new ItemPrinterVisitor();cart.accept(itemPrinter);}
}

??這樣的好處在于,將具體的操作對(duì)象結(jié)構(gòu)分離,后續(xù)增加具體的操作,無需對(duì)對(duì)象結(jié)構(gòu)進(jìn)行修改。因此適用于需要對(duì)對(duì)象結(jié)構(gòu)中的對(duì)象執(zhí)行多種不相關(guān)的操作,而操作的實(shí)現(xiàn)細(xì)節(jié)需要彼此獨(dú)立的場景。
??同時(shí)也可以體會(huì)一下如果不使用訪問者模式,會(huì)存在怎么樣的弊端:

  1. 代碼耦合度高:在ShoppingCart類中,我們需要判斷每個(gè)商品的類型,并為不同類型的商品執(zhí)行不同的操作。這導(dǎo)致了ShoppingCart 類與具體商品類型的緊密耦合。如果要新增一種商品?就又要加一個(gè)條件分支。
  2. 擴(kuò)展性差:同樣地,除了計(jì)算價(jià)格和打印清單,如果還需要再增加一種操作?那么購物車的代碼還需要進(jìn)行修改。
// 書籍類(Book)
public class Book {private String title;private double price;public Book(String title, double price) {this.title = title;this.price = price;}public String getTitle() {return title;}public double getPrice() {return price;}
}// 電子產(chǎn)品類(ElectronicProduct)
public class ElectronicProduct {private String name;private double price;public ElectronicProduct(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;}
}

??在購物車中直接計(jì)算總價(jià),打印清單:

import java.util.ArrayList;
import java.util.List;public class ShoppingCart {private List<Object> items;public ShoppingCart() {items = new ArrayList<>();}public void addItem(Object item) {items.add(item);}public List<Object> getItems() {return items;}// 計(jì)算總價(jià)public double calculateTotalPrice() {double totalPrice = 0;for (Object item : items) {if (item instanceof Book) {totalPrice += ((Book) item).getPrice();} else if (item instanceof ElectronicProduct) {totalPrice += ((ElectronicProduct) item).getPrice();}}return totalPrice;}// 打印訂單清單public void printOrderDetails() {System.out.println("Shopping Cart Details:");for (Object item : items) {if (item instanceof Book) {Book book = (Book) item;System.out.println("Book: " + book.getTitle() + ", Price: " + book.getPrice());} else if (item instanceof ElectronicProduct) {ElectronicProduct product = (ElectronicProduct) item;System.out.println("Product: " + product.getName() + ", Price: " + product.getPrice());}}}
}

三、迭代器模式

??迭代器模式是一種行為型設(shè)計(jì)模式,核心思想是將集合的遍歷操作與集合的實(shí)現(xiàn)分離,從而不暴露集合的內(nèi)部結(jié)構(gòu),只需要依賴一個(gè)公共的接口來訪問集合中的元素。通過這種方式,可以在不改變集合結(jié)構(gòu)的情況下,提供不同的遍歷方式和邏輯,通常包含以下的角色:

  • 迭代器接口:定義遍歷集合元素的方法,可以使用JDK的Iterator接口。
  • 具體迭代器:實(shí)現(xiàn)迭代器接口,負(fù)責(zé)具體的遍歷邏輯。
  • 聚合接口:定義返回一個(gè)迭代器的方法。
  • 具體聚合:實(shí)現(xiàn)聚合接口,維護(hù)集合的實(shí)際數(shù)據(jù)結(jié)構(gòu),并提供創(chuàng)建迭代器的方法。

??假設(shè)現(xiàn)在有一個(gè)電商項(xiàng)目,需要管理多個(gè)訂單。每個(gè)訂單由多個(gè)商品組成。希望能夠順序遍歷訂單中的商品,而不暴露訂單內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),首先創(chuàng)建一個(gè)商品的實(shí)例

public class Product {private String productName;private double price;public Product(String productName, double price) {this.productName = productName;this.price = price;}public String getProductName() {return productName;}public double getPrice() {return price;}
}

??再編寫一個(gè)聚合接口

public interface Aggregate {Iterator createIterator();
}

??創(chuàng)建具體聚合迭代器接口

public class Order implements Aggregate{private String orderId;private Product[] items;public Order(String orderId, Product[] items) {this.orderId = orderId;this.items = items;}public String getOrderId() {return orderId;}public Product[] getItems() {return items;}@Overridepublic Iterator createIterator() {return new OrderIterator(this);}
}
public class OrderIterator implements Iterator {private Order order;private int index;public OrderIterator(Order order) {this.order = order;this.index = 0;}@Overridepublic boolean hasNext() {return index < order.getItems().length;}@Overridepublic Object next() {if (hasNext()) {return order.getItems()[index++];}return null;}
}

??客戶端,創(chuàng)建產(chǎn)品并且遍歷:

public class Client {public static void main(String[] args) {Product p1 = new Product("產(chǎn)品1", 5);Product p2 = new Product("產(chǎn)品2", 6);Product p3 = new Product("產(chǎn)品3", 7);Order order = new Order("10001", new Product[]{p1, p2, p3});Iterator iterator = order.createIterator();while (iterator.hasNext()){Product next = (Product) iterator.next();System.out.println(next);}}
}

??同時(shí)也可以對(duì)比一下不使用迭代器模式,在客戶端中直接遍歷,體會(huì)一下存在哪些弊端:

  1. 客戶端直接操作 Order 類的內(nèi)部實(shí)現(xiàn),如果以后把商品的存儲(chǔ)方式改為其他數(shù)據(jù)結(jié)構(gòu),所有使用 Order 類的代碼都需要修改。
  2. 遍歷商品數(shù)組的邏輯直接寫在了客戶端,每個(gè)需要遍歷商品的地方,都必須重復(fù)寫遍歷邏輯。
  3. 以及如果需要進(jìn)行不同方式的遍歷,需要修改遍歷邏輯以及所有使用到的客戶端的代碼。
public class Product {private String productName;private double price;public Product(String productName, double price) {this.productName = productName;this.price = price;}public String getProductName() {return productName;}public double getPrice() {return price;}
}public class Order {private String orderId;private Product[] items;public Order(String orderId, Product[] items) {this.orderId = orderId;this.items = items;}public String getOrderId() {return orderId;}public Product[] getItems() {return items;}
}public class Client {public static void main(String[] args) {// 創(chuàng)建產(chǎn)品Product p1 = new Product("Laptop", 1000);Product p2 = new Product("Smartphone", 800);Product p3 = new Product("Headphones", 150);// 創(chuàng)建訂單Product[] products = {p1, p2, p3};Order order = new Order("O1001", products);// 直接在客戶端遍歷商品Product[] items = order.getItems();for (int i = 0; i < items.length; i++) {System.out.println("Product: " + items[i].getProductName() + ", Price: " + items[i].getPrice());}}
}

http://aloenet.com.cn/news/43225.html

相關(guān)文章:

  • 新企業(yè)在哪里做網(wǎng)站好關(guān)鍵詞推廣優(yōu)化排名品牌
  • wordpress文章頁面菜單優(yōu)化大師win7
  • 女女做的網(wǎng)站目前最新推廣平臺(tái)
  • 南通網(wǎng)站開發(fā)招聘按效果付費(fèi)的網(wǎng)絡(luò)推廣方式
  • html5手機(jī)網(wǎng)站開發(fā)區(qū)別百度快照推廣
  • 建設(shè)網(wǎng)站必備條件長春網(wǎng)站建設(shè)推廣
  • 大于二高端網(wǎng)站建設(shè)新手seo入門教程
  • 網(wǎng)站標(biāo)簽怎么做重慶網(wǎng)站網(wǎng)絡(luò)推廣
  • 淄博北京網(wǎng)站建設(shè)手機(jī)百度搜索引擎入口
  • 做網(wǎng)站收費(fèi)標(biāo)準(zhǔn)哪個(gè)平臺(tái)可以免費(fèi)打廣告
  • 網(wǎng)站在建設(shè)時(shí)不容忽略的一些細(xì)節(jié)最權(quán)威的排行榜網(wǎng)站
  • 網(wǎng)站建設(shè)中模板下載武漢百度開戶代理
  • 百度搜索不到asp做的網(wǎng)站天津搜狗seo推廣
  • 網(wǎng)站建設(shè)哪個(gè)空間比較好網(wǎng)站怎么優(yōu)化到首頁
  • 上海簡站商貿(mào)有限公司seo基礎(chǔ)理論
  • 做任務(wù)傭金網(wǎng)站源碼互聯(lián)網(wǎng)營銷培訓(xùn)平臺(tái)
  • 公眾號(hào)編輯 wordpress魔貝課凡seo
  • 聚美優(yōu)品網(wǎng)站怎么做的最新的即時(shí)比分
  • 白糖貿(mào)易怎么做網(wǎng)站廈門seo公司到1火星
  • 外貿(mào)網(wǎng)站建設(shè)設(shè)計(jì)杭州做seo的公司
  • 微信h5免費(fèi)制作網(wǎng)站seo優(yōu)化與推廣招聘
  • 招聘網(wǎng)站怎么做營銷軟文代寫平臺(tái)
  • 個(gè)人網(wǎng)站可以做淘寶客杭州網(wǎng)站推廣平臺(tái)
  • 商城網(wǎng)站建站深圳優(yōu)化seo排名
  • 如果做鏡像網(wǎng)站360廣告投放平臺(tái)
  • 北京的網(wǎng)站設(shè)計(jì)公司線上營銷策劃方案
  • 重慶做網(wǎng)站微信的公司提高搜索引擎檢索效果的方法
  • 郴州seo快速排名關(guān)鍵詞優(yōu)化排名工具
  • 重慶市建設(shè)工程信息網(wǎng)一體化平臺(tái)河源市企業(yè)網(wǎng)站seo價(jià)格
  • 手機(jī)網(wǎng)站排名優(yōu)化軟件網(wǎng)絡(luò)營銷推廣方式都有哪些