我想学习有关设计模式的知识,并能够在Excel VBA中应用它们。因此,为了了解模式,我买了一本看起来很有前途的书:“Head First Design Pattern”;它清晰地呈现了材料。然而,代码练习/示例是用Java8编写的。“扩展”),所以我需要弄清楚如何在VBA中实现相同/相似的功能。
我正在跟随这些练习,做我认为与VBA中的Java相似的事情。我在这里问的是“我在正确的轨道上吗?”我知道这是一个很大的问题,也许这个问题太宽泛了,但也可能不是。
“Main”过程有一些不同之处,因为我还没有完全模仿VBA中的Java。我对“Duck”和“Mallard”的实现更感兴趣。
我们非常感谢您的任何建议。
以下是on练习的一部分的Java:
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
public class MiniDuckSimulator {
public static void main(String[] args) {
MallardDuck mallard = new MallardDuck();
FlyBehavior cantFly = () -> System.out.println("I can't fly");
QuackBehavior squeak = () -> System.out.println("Squeak");
RubberDuck rubberDuckie = new RubberDuck(cantFly, squeak);
DecoyDuck decoy = new DecoyDuck();
Duck model = new ModelDuck();
mallard.performQuack();
rubberDuckie.performQuack();
decoy.performQuack();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}下面是我在VBA中所做的工作:
'@Folder("SimUDuck.Objects.HeadFirst")
Option Explicit
Private Type TObject
FlyBehavior As IFlyBehavior
QuackBehavior As IQuackBehavior
DuckModel As IDuckModel
End Type
Private this As TObject
Private Sub Class_Terminate()
With this
Set .FlyBehavior = Nothing
Set .QuackBehavior = Nothing
End With
End Sub
Public Property Get DuckModel() As IDuckModel
Set DuckModel = this.DuckModel
End Property
Public Property Set DuckModel(ByVal model As IDuckModel)
With this
Set .DuckModel = model
End With
End Property
Public Property Get FlyBehavior() As IFlyBehavior
Set FlyBehavior = this.FlyBehavior
End Property
Public Property Set FlyBehavior(ByVal behavior As IFlyBehavior)
Set this.FlyBehavior = behavior
End Property
Public Property Get QuackBehavior() As IQuackBehavior
Set QuackBehavior = this.QuackBehavior
End Property
Public Property Set QuackBehavior(ByVal behavior As IQuackBehavior)
Set this.QuackBehavior = behavior
End Property
Public Sub performFly()
this.FlyBehavior.Fly
End Sub
Public Sub performQuack()
this.QuackBehavior.Quack
End Sub
Public Sub Swim()
'todo
End Sub
Public Sub Display()
this.DuckModel.Display
End Sub
'@PredeclaredId
'@Folder("SimUDuck.Models.HeadFirst")
Option Explicit
Private Type TModel
Display As String
End Type
Private this As TModel
Implements IDuckModel
Private Sub IDuckModel_Display()
Debug.Print this.Display '"I'm A Mallard Duck"
End Sub
Public Function CreateDuck(ByVal duck As DuckObject) As IDuckModel
With duck
Set .FlyBehavior = New FlyWithWingsBehavior
Set .QuackBehavior = New QuackBehavior
End With
With New MallardDuckModel
.Display = "I'm A Mallard Duck"
Set CreateDuck = .Self
End With
End Function
Public Property Get Self() As IDuckModel
Set Self = Me
End Property
Public Property Get Display() As String
Display = this.Display
End Property
Public Property Let Display(ByVal value As String)
this.Display = value
End Property
Public Sub MainDuck()
Dim duck As DuckObject
Set duck = New DuckObject
With New MallardDuckModel
Dim model As IDuckModel
Set model = .CreateDuck(duck)
End With
With duck
Set .DuckModel = model
.performFly
.performQuack
.Display
Dim FlyBehavior As IFlyBehavior
Set FlyBehavior = New FlyRocketPoweredBehavior
Set .FlyBehavior = FlyBehavior
Dim QuackBehavior As IQuackBehavior
Set QuackBehavior = New SqueakBehavior
Set .QuackBehavior = QuackBehavior
.performFly
.performQuack
.Display
End With
Set duck = New DuckObject
With New ModelDuckModel
Set model = .CreateDuck(duck)
End With
With duck
Set .DuckModel = model
.performFly
.performQuack
.Display
End With
End Sub发布于 2020-05-25 23:18:05
在搜索Head First Design Pattern练习的翻译时,我偶然发现了这篇文章。我一直使用RubberduckVBA博客文章作为在VBA语言中实现OOP概念和设计模式(特别是工厂)的指南。
https://stackoverflow.com/questions/58146824
复制相似问题