首页 > 其他分享 >关于Visitor模式的一些看法

关于Visitor模式的一些看法

时间:2024-05-28 21:12:35浏览次数:17  
标签:customer 看法 Visitor Accept 模式 func visitor type

访问者模式(Visitor)

1.意图

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

2.适用性

在下列情况下使用Visitor模式:

一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

3.结构

4.代码

package visitor

import "testing"

/*
# 访问者模式
访问者模式可以给一系列对象透明的添加功能,并且把相关代码封装到一个类中。
对象只要预留访问者接口`Accept`则后期为对象添加功能的时候就不需要改动对象。
*/

type Visitor interface {
	VisitCPU(cpu CPU)
	VisitMemory(memory Memory)
	VisitBoard(board Board)
}


type ComputerPart interface {
	Accept(visitor Visitor)
	//some other operations eg:getName getBrand
	GetPrice()float64
}


type CPU struct {
	ComputerPart
}

func (this CPU)Accept(visitor Visitor){
	visitor.VisitCPU(this)
}
func (this CPU)GetPrice()float64{
	return 500
}


type Memory struct {
	ComputerPart
}

func (this Memory)Accept(visitor Visitor){
	visitor.VisitMemory(this)
}
func (this Memory)GetPrice()float64{
	return 300
}

type Board struct {
	ComputerPart
}

func (this Board)Accept(visitor Visitor){
	visitor.VisitBoard(this)
}
func (this Board)GetPrice()float64{
	return 200
}


type Computer struct {
	cpu    CPU
	memory Memory
	board  Board
}

func (this *Computer)Accept(visitor Visitor){
	this.cpu.Accept(visitor)
	this.memory.Accept(visitor)
	this.board.Accept(visitor)
}

type PersonelVisitor struct {
	TotalPrice float64
	Visitor
}

func (this *PersonelVisitor)VisitCPU(cpu CPU)  {
	this.TotalPrice += cpu.GetPrice()*0.9

}
func (this *PersonelVisitor)VisitMemory(memory Memory)  {
	this.TotalPrice += memory.GetPrice()*0.85
}
func (this *PersonelVisitor)VisitBoard(board Board)  {
	this.TotalPrice += board.GetPrice()*0.9
}

type CorpVisitor struct {
	TotalPrice float64
	Visitor
}
func (this *CorpVisitor)VisitCPU(cpu CPU)  {
	this.TotalPrice += cpu.GetPrice()*0.6
}
func (this *CorpVisitor)VisitMemory(memory Memory)  {
	this.TotalPrice += memory.GetPrice()*0.75
}
func (this *CorpVisitor)VisitBoard(board Board)  {
	this.TotalPrice += board.GetPrice()*0.75
}

func TestVisitor(t *testing.T)  {
	p0:=&PersonelVisitor{}
	p1:=&CorpVisitor{}
	c:=Computer{}
	c.Accept(p0)
	c.Accept(p1)


	t.Log("Personel购买价格:",p0.TotalPrice)
	t.Log("Corp购买价格:",    p1.TotalPrice)
}



//type Customer interface {
//	Accept(Visitor)
//}
//
//type Visitor interface {
//	Visit(Customer)
//}
//
//
//type EnterpriseCustomer struct {
//	name string
//}
//
//type CustomerCol struct {
//	customers []Customer
//}
//
//func (c *CustomerCol) Add(customer Customer) {
//	c.customers = append(c.customers, customer)
//}
//
//func (c *CustomerCol) Accept(visitor Visitor) {
//	for _, customer := range c.customers {
//		customer.Accept(visitor)
//	}
//}
//
//func NewEnterpriseCustomer(name string) *EnterpriseCustomer {
//	return &EnterpriseCustomer{
//		name: name,
//	}
//}
//
//func (c *EnterpriseCustomer) Accept(visitor Visitor) {
//	visitor.Visit(c)
//}
//
//type IndividualCustomer struct {
//	name string
//}
//
//func NewIndividualCustomer(name string) *IndividualCustomer {
//	return &IndividualCustomer{
//		name: name,
//	}
//}
//
//func (c *IndividualCustomer) Accept(visitor Visitor) {
//	visitor.Visit(c)
//}
//
//type ServiceRequestVisitor struct{}
//
//func (*ServiceRequestVisitor) Visit(customer Customer) {
//	switch c := customer.(type) {
//	case *EnterpriseCustomer:
//		fmt.Printf("serving enterprise customer %s\n", c.name)
//	case *IndividualCustomer:
//		fmt.Printf("serving individual customer %s\n", c.name)
//	}
//}
//
 only for enterprise
//type AnalysisVisitor struct{}
//
//func (*AnalysisVisitor) Visit(customer Customer) {
//	switch c := customer.(type) {
//	case *EnterpriseCustomer:
//		fmt.Printf("analysis enterprise customer %s\n", c.name)
//	}
//}
//
//
//func ExampleRequestVisitor() {
//	c := &CustomerCol{}
//	c.Add(NewEnterpriseCustomer("A company"))
//	c.Add(NewEnterpriseCustomer("B company"))
//	c.Add(NewIndividualCustomer("bob"))
//	c.Accept(&ServiceRequestVisitor{})
//	// Output:
//	// serving enterprise customer A company
//	// serving enterprise customer B company
//	// serving individual customer bob
//}
//
//func ExampleAnalysis() {
//	c := &CustomerCol{}
//	c.Add(NewEnterpriseCustomer("A company"))
//	c.Add(NewIndividualCustomer("bob"))
//	c.Add(NewEnterpriseCustomer("B company"))
//	c.Accept(&AnalysisVisitor{})
//	// Output:
//	// analysis enterprise customer A company
//	// analysis enterprise customer B company
//}


标签:customer,看法,Visitor,Accept,模式,func,visitor,type
From: https://www.cnblogs.com/zhh200442/p/18218901

相关文章

  • 设计模式——工厂三兄弟之简单工厂
    1.业务需求​大家好,我是菠菜。在介绍这期简单工厂设计模式前,我们先来看看这样的需求:制作一个简单的计算器,能够实现控制台输入俩个数以及运算符完成运算。2.初步实现实现第一版思路:​创建计算器类,控制台输入俩个数以及运算符,通过if条件输出运算结果。CalClient类:pu......
  • MySQL四种主要的存储引擎,约束条件null not null,严格模式,基本字段类型之整型,浮点型,
    ⅠMySQL之存储引擎【一】什么是存储引擎日常生活中文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制针对不同的数据应该有对应的不同的处理机制存储引擎就是不同的处理机制【二】MySQL四种主要的存储引擎【1】Innodb是MySQL5.5版本之后的默认存......
  • 【工厂模式应用】
    工厂模式应用1.需求描述2.类图设计3.代码实现3.1解析器3.2解析器工厂3.3解析器代理4.测试1.需求描述不同协议进行不同解析规则,能否创建一个工厂根据当前协议类型提供解析器进行解析2.类图设计3.代码实现3.1解析器IParser:基类IParser......
  • 策略模式
    策略模式(StrategyPattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。这种模式的主要目的是通过封装算法,解耦算法的实现与使用,提供不同算法的灵活选择。策略模式的组成部分策略接口(St......
  • 简单工厂模式、工厂模式、抽象工厂模式
    工厂模式(FactoryPattern)是一种创建对象的设计模式,它提供了一种方法来将对象的创建过程与对象的使用过程分离。工厂模式在软件开发中有广泛的应用,适用于不同的场景和需求。下面是几种常见的工厂模式及其应用场景:1.简单工厂模式(SimpleFactoryPattern)简单工厂模式通过一个工厂......
  • 工厂方法模式(Factory Method Pattern)
    工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,它在父类中提供一个创建对象的方法,允许子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,使得系统在不修改原有代码的情况下可以扩展,从而实现了开闭原则(对扩展开放,对修改关闭)模式结构抽象工厂(Abstr......
  • 抽象工厂模式(Abstract Factory)
    抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。模式结构抽象工厂模式包含以下角色:抽象......
  • 单例模式(Singleton)
    单例模式(SingletonPattern)是设计模式中最简单也最常见的一种。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在单例模式中,一个类只有一个实例存在,同时该类的实例由一个预先定义好的静态引用变量所持有,以便在整个系统中随时访问它。模式结构与角色单例类......
  • 装饰器模式(Decorator)
    装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责(即增加其功能),就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式是一种对象结构型模式,在其结构图中含有一个作为抽象构件(Component)角色的接口和多个实现了该接口的抽象装饰类......
  • 设计模式概要
    常见的5中设计模式1.但通常所说的“23种设计模式”是指那些在实践中被广泛认可和使用的设计模式。这些设计模式可以分为以下三类:创建型模式(CreationalPatterns):用于处理对象的创建机制,以提高系统的灵活性和可重用性。单例模式(Singleton):确保一个类只有一个实例,并提供一个全局......