我经常在代码中看到这个,但是当我说到它时,我不知道这种'模式'的名称
我有一个带有2个参数的方法,它调用一个有3个参数的重载方法,并故意将第3个参数设置为空字符串.
public void DoWork(string name, string phoneNumber)
{
DoWork(name, phoneNumber, string.Empty)
}
private void DoWork(string name, string phoneNumber, string emailAddress)
{
//do the work
}
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是不重复代码,并允许现有的调用者仍然调用只有2个参数的方法.
这是一种模式,它有一个名字吗?
我想简短一点.我建有两间HouseA,说BedRoom和StudyRoom,从所谓的基类派生两者Room.
BedRoom并且StudyRoom有一个同一个父母叫House.此外,房屋内的任何房间只能通过父母进入任何其他房间.如果BedRoom必须访问任何属性StudyRoom,它必须只通过House(即父),反之亦然.
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Run Code Online (Sandbox Code Playgroud)
现在的问题:让我们说,我建造另一个家(比方说HouseB),这与上面完全相同,但只有一个改变.我不想要两个单独的房间(即BedRoom和StudyRoom),而是一个房间(MasterRoom),这两个房间都有这些设施.为了代码可重用性,我可以想到以下设计选项:
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Run Code Online (Sandbox Code Playgroud)
在这里,我失去了再利用的属性的能力BedRoom和StudyRoom我的创造HouseA.请注意,大多数的属性BedRoom,并StudyRoom需要重新实现MasterRoom无论如何,从而导致代码重复.
Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS …Run Code Online (Sandbox Code Playgroud) 今天我看了ZipEntry上课,发现了以下内容:
public class ZipEntry implements ZipConstants, Cloneable
Run Code Online (Sandbox Code Playgroud)
ZipConstants没有定义任何方法 - 只有常量(static final int LOCHDR = 30)
然后我发现使用常量实现接口允许您直接访问这些常量,就好像它们是在类本身中定义的一样.例如:
public interface Constants {
static final int CONST = 2;
}
public class implements Constants {
int doSomething(int input) {
return CONST * input;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有其他原因不使用此,除了:
我很好奇,因为这绝对不是一种常见的做法.
我试图在java中实现一个堆栈(使用列表接口:接口列表).
我想以两种不同的方式实现它:使用组合和继承.
对于继承,到目前为止我有:
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class StackInheritance implements List {
//implement list methods
}
Run Code Online (Sandbox Code Playgroud)
对于作文,我有:
import java.util.List;
public abstract class StackComposition implements List {
// implement some standard methods
}
public class StackViaList extends StackComposition {
// implement methods that have not been implemented in the abstract
// class
}
Run Code Online (Sandbox Code Playgroud)
我很困惑从哪里开始.我之前从未使用过接口,所以我是否应该使用List方法来"模仿"堆栈,例如使用Array或ArrayList?
另外,对于合成,我不明白应该在StackComposition中使用哪些方法以及应该在StackViaList中使用什么方法.在不完全理解接口以及继承和组合之间,我有点迷失.我似乎还不能"得到它"......
任何帮助将不胜感激,谢谢!
我之前对装饰器模式的理解是你继承Window了WindowDecorator,然后在重写的方法中,在调用Window所述方法的实现之前做了一些额外的工作.类似于以下内容:
public class Window
{
public virtual void Open()
{
// Open the window
}
}
public class LockableWindow : Window // Decorator
{
public virtual void Open()
{
// Unlock the window
base.Open();
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这基本上是对装饰进行硬编码,那么如何使用合成而不是继承来重构呢?
composition ×3
java ×3
c# ×2
inheritance ×2
decorator ×1
list ×1
oop ×1
overloading ×1
perl ×1
stack ×1
terminology ×1