我们一起来读书吧 关注:154贴子:2,808
  • 0回复贴,共1

设计模式-可复用面向对象软件的基础 4.5-4.6

只看楼主收藏回复

4.5 FACEDE(外观)对象结构型模式
外观模式:为子系统中的一组接口提供一个统一的高层接口。定义了一个高层接口,使子系统更容易使用。
4.6 FLYWEIGHT(亨元)对象结构型模式
亨元模式:通过共享细粒度对象实现对象的复用,从而达到减少对象创建与销毁,减少内存消耗,其本质是本质是缓存共享对象,降低内存消耗。
享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象的信息分为两个部分:内部状态和外部状态。
内部状态指对象共享出来的信息,存储在享元信息内部,并且不回随环境的改变而改变;
外部状态指对象得以依赖的一个标记,随环境的改变而改变,不可共享。
比如,连接池中的连接对象,保存在连接对象中的用户名、密码、连接URL等信息,在创建对象的时候就设置好了,不会随环境的改变而改变,这些为内部状态。而当每个连接要被回收利用时,我们需要将它标记为可用状态,这些为外部状态。
适用场景:缓冲池,数据库连接池。管理和复用连接对象,减少内存占用和创建、销毁的次数。
外观模式的代码示例:
在这个例子中,我们定义了两个子系统SubSystemA和SubSystemB,以及一个外观模式Facade。Facade提供了一个统一的接口MethodC,它封装了子系统A和B的方法调用。当客户端调用Facade的MethodC时,它会调用子系统A和B的相关方法。这样,客户端只需要与Facade交互,而不需要直接与子系统交互,从而简化了系统的使用。
package main
import "fmt"
// SubSystemA 子系统A
type SubSystemA struct{}
// MethodA 子系统A的方法
func (sa *SubSystemA) MethodA() {
fmt.Println("SubSystemA MethodA")
}
// SubSystemB 子系统B
type SubSystemB struct{}
// MethodB 子系统B的方法
func (sb *SubSystemB) MethodB() {
fmt.Println("SubSystemB MethodB")
}
// Facade 外观模式结构体
type Facade struct {
a SubSystemA
b SubSystemB
}
// NewFacade 创建一个新的外观模式对象
func NewFacade() *Facade {
return &Facade{
a: SubSystemA{},
b: SubSystemB{},
}
}
// MethodC 外观模式提供的方法
func (f *Facade) MethodC() {
f.a.MethodA()
f.b.MethodB()
}
func main() {
facade := NewFacade()
facade.MethodC()
}


IP属地:北京1楼2024-10-11 14:27回复