在JavaScript的開發(fā)過程中,設(shè)計(jì)模式是程序員們必須了解的重要概念之一。設(shè)計(jì)模式是開發(fā)者在特定場景下遇到的通用問題的解決方法的總結(jié)。通過使用設(shè)計(jì)模式,我們可以避免重復(fù)造輪子的情況,同時(shí)也可以提高代碼的可維護(hù)性、可讀性和可擴(kuò)展性。在這篇文章中,我們將整理一些常見的JavaScript設(shè)計(jì)模式,并通過舉例來詳細(xì)說明各自的功能和應(yīng)用場景。
1. 單例模式
單例模式是一種創(chuàng)建型設(shè)計(jì)模式,它保證類只有一個(gè)實(shí)例,并提供了一個(gè)全局訪問點(diǎn)。在JavaScript中,一個(gè)典型的單例模式實(shí)現(xiàn)如下:
```
var Singleton = (function () {
var instance;
function createInstance() {
var object = new Object("I am the instance");
return object;
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
```
在上述代碼中,創(chuàng)建了一個(gè)名為Singleton的立即執(zhí)行函數(shù),并在其中定義了一個(gè)內(nèi)部變量`instance`。函數(shù)`createInstance()`用來創(chuàng)建對(duì)象實(shí)例。在立即執(zhí)行函數(shù)中返回一個(gè)對(duì)象,這個(gè)對(duì)象包含一個(gè)公共方法`getInstance()`,用來獲取或創(chuàng)建實(shí)例。當(dāng)`getInstance()`這個(gè)方法第一次被調(diào)用時(shí),會(huì)檢查實(shí)例是否已經(jīng)存在并返回該實(shí)例,否則會(huì)創(chuàng)建一個(gè)新的實(shí)例并返回。
2. 觀察者模式
觀察者模式是一種行為設(shè)計(jì)模式,它允許對(duì)象在發(fā)生變化時(shí)通知其他對(duì)象。在觀察者模式中,我們定義一種發(fā)布者和訂閱者的關(guān)系。當(dāng)發(fā)布者狀態(tài)改變時(shí),所有訂閱者都會(huì)接收到相應(yīng)的更改通知。以下是一個(gè)簡單的觀察者模式實(shí)現(xiàn):
```
function ObserverList() {
this.observerList = [];
}
ObserverList.prototype.add = function (obj) {
return this.observerList.push(obj);
};
ObserverList.prototype.get = function (index) {
if (index >-1 && index< this.observerList.length) {
return this.observerList[index];
}
};
ObserverList.prototype.count = function () {
return this.observerList.length;
};
ObserverList.prototype.removeAt = function (index) {
this.observerList.splice(index, 1);
};
function Subject() {
this.observers = new ObserverList();
}
Subject.prototype.addObserver = function (observer) {
this.observers.add(observer);
};
Subject.prototype.removeObserver = function (observer) {
this.observers.removeAt(this.observers.indexOf(observer, 0));
};
Subject.prototype.notify = function (context) {
var observerCount = this.observers.count();
for (var i = 0; i< observerCount; i++) {
this.observers.get(i).update(context);
}
};
function Observer() {
this.update = function () {
// ...
};
}
```
在上述代碼中,先創(chuàng)建了一個(gè)名為ObserverList的類,它包含了一個(gè)observerList數(shù)組和一些基本的數(shù)組操作函數(shù)。然后,定義了一個(gè)名為Subject的類,它有一個(gè)observers數(shù)組用于存儲(chǔ)觀察者列表。Subject還包含了一些基本的觀察者操作函數(shù),如添加、移除和通知觀察者。最后,定義了一個(gè)名為Observer的類,它包含一個(gè)update函數(shù),在該函數(shù)中可以進(jìn)行狀態(tài)更新。
3. 工廠模式
工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供一種方式來創(chuàng)建對(duì)象,而無需指定要?jiǎng)?chuàng)建的對(duì)象的具體類型。工廠模式讓開發(fā)者能夠?qū)?duì)象實(shí)例化的過程從客戶端代碼中分離出來,使其保持獨(dú)立。以下是一個(gè)簡單的工廠模式實(shí)現(xiàn):
```
function Car(options) {
this.doors = options.doors || 4;
this.state = options.state || "brand new";
this.color = options.color || "silver";
}
function Truck(options) {
this.state = options.state || "used";
this.wheelSize = options.wheelSize || "large";
this.color = options.color || "blue";
}
function VehicleFactory() {}
VehicleFactory.prototype.vehicleClass = Car;
VehicleFactory.prototype.createVehicle = function (options) {
if (options.vehicleType === "car") {
this.vehicleClass = Car;
} else {
this.vehicleClass = Truck;
}
return new this.vehicleClass(options);
};
var carFactory = new VehicleFactory();
var car = carFactory.createVehicle({
vehicleType: "car",
color: "yellow",
doors: 6
});
var truckFactory = new VehicleFactory();
var truck = truckFactory.createVehicle({
vehicleType: "truck",
state: "like new",
color: "red",
wheelSize: "small"
});
```
在上述代碼中,定義了兩個(gè)類Car和Truck,然后定義了一個(gè)名為VehicleFactory的工廠類。VehicleFactory類包含prototype屬性,這個(gè)屬性包含了繼承自基類的所有方法和屬性。在VehicleFactory中,我們定義了一個(gè)vehicleClass變量,它標(biāo)識(shí)要?jiǎng)?chuàng)建哪種類型的車輛。createVehicle()方法接受一個(gè)選項(xiàng)對(duì)象,然后按照選項(xiàng)對(duì)象中的車輛類型來創(chuàng)建相應(yīng)的車輛對(duì)象。最后,我們創(chuàng)建兩個(gè)工廠實(shí)例分別用來創(chuàng)建車輛對(duì)象。
總結(jié)
以上三種設(shè)計(jì)模式只是JavaScript中的冰山一角,設(shè)計(jì)模式是代碼復(fù)用和優(yōu)化的主要手段之一。如何運(yùn)用好這些設(shè)計(jì)模式,對(duì)于移動(dòng)端開發(fā)者是一個(gè)重要的技能層面,只有掌握設(shè)計(jì)模式的技術(shù),才能更好地提升代碼的可重用性,并減少開發(fā)成本。
網(wǎng)站導(dǎo)航
- zblogPHP模板zbpkf
- zblog免費(fèi)模板zblogfree
- zblog模板學(xué)習(xí)zblogxuexi
- zblogPHP仿站zbpfang