vue運用的設計模式:1、單例模式,確保一個類只有一個範例物件,並提供一個全域性存取點供其存取。2、工廠模式,是用來建立物件的一種模式,不必暴露建構函式的具體邏輯,而是將邏輯封裝在一個個函數之中。3、裝飾器模式,允許向現有的函數新增新的功能,同時不改變其結構。4、策略模式,就是定義一系列的演演算法,把他們一個個封裝起來,並且使他們可以相互替換。5、釋出訂閱者模式。
本教學操作環境:windows7系統、vue3版,DELL G3電腦。
設計模式的原則是找出程式中的變化,並將變化封裝起來,實現高效的可複用性。核心在於意圖,而不在結構。通過設計模式可以幫助我們增強程式碼的可重用性、可擴充性、 可維護性、靈活性。我們使用設計模式的最終目的是為了實現程式碼的高類聚和低耦合。你是否思考過這樣的一個問題,如何讓程式碼寫的更有健壯性,其實核心在於把握變與不變。確保變的部分更加靈活,不變的地方更加穩定,而使用設計模式可以讓我們達到這樣的目的。
下面來總結一下vue專案中或者說工作中常用的設計模式。
單例模式:確保一個類只有一個範例物件,並提供一個全域性存取點供其存取。
優點:適用於單一物件,只生成一個物件範例,避免頻繁建立和銷燬範例,減少記憶體佔用。
缺點:不適用動態擴充套件物件。
場景:登入浮窗、Vue中的axios範例(我們對axios進行請求攔截和響應攔截,多次呼叫封裝好的axios但是僅設定一次,封裝好的axios匯出就是一個單例)、全域性態管理 store、執行緒池、全域性快取
function Person (name, age) {
this.name = name
this.age = age
this.info = function () {
console.log(`我的名字叫${this.name}, 我今年${this.age}了`)
}
}
Person.getInstance = function (name, age) {
if (!this.instance) {
this.instance = new Person(name, age)
}
console.log(this.instance)
return this.instance
}
let b1 = Person.getInstance('單例1', 18)
let b2 = Person.getInstance('單例2', 18)
b1.info()
b2.info()
登入後複製
工廠模式:工廠模式是用來建立物件最常見的一種設計模式。不必暴露建構函式的具體邏輯,而是將邏輯封裝在一個個函數之中,那麼這個建構函式就可以被看做工廠。
場景: 有建構函式的地方,寫了大量的建構函式程式碼,呼叫了大量的new操作符。
優點:通過工廠模式,我們可以快速建立大量相似物件,沒有重複程式碼。
缺點:工廠模式建立的物件屬於Object,無法區分物件型別,這也是工廠模式沒有廣泛使用的原因。
function Factory (name, age) {
this.name = name;
this.age = age;
// 或者
// let obj = {}
// obj.name = name
// obj.age = age
// return obj
}
Factory.prototype.say = function () {
console.log(`我的名字叫${this.name}, 我今年${this.age}了`)
}
let zs = new Factory('張三', 18);
let ls = new Factory('李四', 20);
zs.say()
ls.say()
登入後複製
裝飾器模式(切面程式設計AOP): 在不改變物件自身的基礎上,在程式執行期間給物件動態的新增職責;若直接修改函數體,則違背了’開放封閉原則’,也違背了我們的’單一職責原則’;簡單的說就是允許向現有的函數新增新的功能,同時不改變其結構。
場景: vue中的表單驗證與表單提交就運用了這種模式,遵循封閉開放原則。
function before (fn, callback) {
let _this = this;
return function () {
callback.apply(this, arguments)
return fn.bind(this, arguments)
}
}
function after (fn, callback) {
let _this = this
return function () {
let res = fn.apply(this, arguments)
callback.apply(this, arguments)
return res
}
}
// before和after是兩個高階函數,讓我們一起回憶一下什麼是高階函數?
// 還知道call,apply,bind的區別嗎
let getName = function getName () {
// 加入這是你同事寫的爛程式碼,看不下去的那種,那麼別動他的程式碼
console.log('這是getName函數')
}
before(getName, function () {
// 這個就是你要寫的新邏輯
console.log('切入前程式碼')
})()
after(getName, function () {
// 這個也是你要寫的新邏輯
console.log('切入後程式碼')
})()
登入後複製
策略模式: 就是定義一系列的演演算法,把他們一個個封裝起來,並且使他們可以相互替換。
let strategy = {
'A': function (bonus) {
return bonus * 4
},
'B': function (bonus) {
return bonus * 3
}
}
function fn (level, bonus) {
return strategy[level](bonus)
}
let result = fn('A', 4000)
console.log(result, 'result')
// 策略模式提供了開放-封閉原則,將演演算法或者方法封裝在一個類中,使它們易於切換,易於替換。
function func (a, b) {
let f = function f() {
return a + b
}
return f
}
登入後複製
在vue表單驗證時也可以運用
// 這裡可以將所有的表單驗證正則函數寫在這裡
export const loginUsername = (str) => {
return /^[a-zA-Z0-9_]{3,20}$/.test(str);
};
登入後複製
import * as validateForm from './validate';
export const gene = (key, msg) => {
return (r, v, c) => {
if (validateForm[key](v)) {
c();
} else {
c(new Error(msg));
}
};
};
登入後複製
// 這樣看著是不是很清晰明瞭
import {gene} from '@/utils/formValidateGene';
rules: {
account: [{ required: true, validator: gene('loginUsername', '請輸入合適的賬號'), trigger: ['blur', 'change'] }]
}
登入後複製
釋出訂閱者模式又叫觀察者模式,釋出訂閱者模式一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得將得到通知;觀察者模式則是一種一對一的依賴關係。
class Observer {
client = {}
// 訂閱
listen (key, fn) {
if (!this.client[key]) {
this.client[key] = []
}
this.client[key].push(fn)
}
// 釋出
publish (key) {
this.client[key].forEach(fn => {
fn.apply(this, arguments)
})
}
}
let observer = new Observer()
observer.listen('華為', (model, brand) => {
console.log(model, brand)
})
observer.listen('蘋果', function (model, brand) {
console.log(model, brand)
})
observer.publish('華為', 'P50')
observer.publish('蘋果', '14')
登入後複製
class EventEmitter {
constructor () {
this.client = {}
}
on (key, fn) {
if (!this.client[key]) {
this.client[key] = []
}
this.client[key].push(fn)
}
trigger (key, ...args) {
this.client[key].forEach(cb => cb(...args))
}
}
let event = new EventEmitter()
event.on('hello', function(res) {
console.log('hello', res)
})
let data = {
name: '測試'
}
Object.defineProperty(data, 'name', {
get (val) {
// console.log(val)
},
set (newVal) {
console.log(newVal)
event.trigger('hello', newVal)
}
})
data.name = '正在測試'
登入後複製
【相關推薦:、】
以上就是vue運用了哪些模式的詳細內容,更多請關注TW511.COM其它相關文章!