"Tailored Adapter"
Shape subclass:
#TextShape
instanceVariableNames: 'textView'
classVariableNames: ''
poolDictionaries: ''
TextShape class>>new
"Return a new instance of me
pointing
to an instance of TextView."
^self basicNew
textView: TextView new
TextShape>>textView
"Return my Adaptee"
^textView
TextShape>>textView: aTextView
"Set my Adaptee"
textView := aTextView
TextShape>>boundingBox
"Translate and delegate this to my
TextView object."
^self textView getExtent
TextShape>>isEmpty
^self textView isEmpty
"Message-based Pluggable Adapter"
Object subclass: #MessageAdapter
instanceVariableNames: 'adaptee getSelector setSelector'
classVariableNames: ''
poolDictionaries: ''
MessageAdapter class>>on: anAdaptee
"Instance creation"
^self new adaptee: anAdaptee
MessageAdapter>>adaptee: anObject
adaptee := anObject
MessageAdapter>>adaptee
^adaptee
MessageAdapter>>getSelector: aSymbol
"Setup my getter message
translation.
aSymbol is the selector to send to my Adaptee
when I
receive the #value message"
getSelector:= aSymbol
MessageAdapter>>setSelector: aSymbol
"Setup my setter message
translation.
aSymbol is the selector to send to my Adaptee
when I
receive the #value: message"
setSelector:= aSymbol
MessageAdapter>>onAspect: aspectSymbol
"A handy method to set
both setter and getter
messages in one shot; assumes both have the same
name,
differing only by the ':' suffix for the setter."
self
getSelector: aspectSymbol;
setSelector: (aspectSymbol, ':') asSymbol
MessageAdapter>>value
"Return the aspect of my Adaptee
specified by
my getSelector"
^adaptee perform: getSelector
MessageAdapter>>value: anObject
"Set the aspect of my Adaptee
specified by
my setSelector"
^adaptee perform: setSelector with:
anObject
"adapter := MessageAdapter on: myApplicationModel.
adapter
getSelector: #socialSecurity;
setSelector: #socialSecurity:."
"adapter onAspect: #socialSecurity."
"The bridge pattern code is directly taken from the VisualWorks image"
Object subclass: #Asset
instanceVariables: ''
classVariables: ''
poolVariables: ''
Asset>>value
"Return the value of this Asset."
^self
subclassResponsibility
Asset>>containsSecurity: aSecurity
"Answer whether this Asset
contains aSecurity."
^self subclassResponsibility
Asset subclass: #Security
instanceVariables: 'value'
classVariables: ''
poolVariables: ''
Security>>value
"See superimplementor."
^value
Security>>containsSecurity: aSecurity
"See superimplementor."
"For a Leaf, we'll say it includes aSecurity
if it is aSecurity."
^self = aSecurity
Asset subclass: #CompositeAsset
instanceVariables: 'assets'
classVariables: ''
poolVariables: ''
CompositeAsset>>assets
"Return the list of assets."
^assets
CompositeAsset>>value
"See superimplementor."
"Return the
sum of the assets."
^self assets
inject: 0
into: [ :sum :asset | sum
+ asset value]
CompositeAsset>>containsSecurity: aSecurity
"See
superimplementor."
"See if one of the assets is aSecutiry."
^self assets
includes: aSecurity
CompositeAsset>>containsSecurity: aSecurity
"See
superimplementor."
"See if one of the assets is aSecutiry."
self assets
detect: [ :asset | asset containsSecurity: aSecurity]
ifNone: [^false].
^true
Object subclass: #AbstractPolicy
instanceVariables: ''
classVariables: ''
poolVariables: ''
AbstractPolicy>>reimbursementForClaim: aClaim
"Calculate and
return how much money
the policy will pay for aClaim."
^self
subclassResponsibility
AbstractPolicy subclass: #Policy
instanceVariables: '' "reimbursement
variables"
classVariables: ''
poolVariables: ''
Policy>>reimbursementForClaim: aClaim
"See superimplementor."
"... code to calculate the reimbursement ..."
AbstractPolicy subclass: #PolicyCap
instanceVariables: 'policy
capAmount'
classVariables: ''
poolVariables: ''
PolicyCap>>reimbursementForClaim: aClaim
"See
superimplementor."
| uncappedAmount cappedAmount |
uncappedAmount :=
self policy reimbursementForClaim: aClaim.
cappedAmount := uncappedAmount
min: self capAmount.
^cappedAmount
The remainder of the code in Decorator is taken from the KSC File Reader.
DatabaseBroker>>save: anObject
"Save this object into the
database."
|columnMap statement|
columnMap := anObject class columnMap.
statement := (anObject isPersistent)
ifTrue: [SQLUpdate new
fromObject: anObject
columnMap: columnMap]
ifFalse: [SQLInsert new
fromObject: anObject
columnMap: columnMap].
self databaseConnection
execute: statement
SQLInsert>>fromObject:object columnMap:columnMap
"Create an
insert statement from this object
and its column map."
| stream |
stream := WriteStream on: String new.
stream
nextPutAll: 'INSERT
INTO ';
nextPutAll: columnMap tableName;
nextPut: $(.
columnMap
columnNames do:
[:name |
stream
nextPutAll: name;
nextPut: $,].
"Eliminate the last comma:"
stream position: stream position - 1.
stream nextPutAll: ') VALUES ('.
(columnMap valuesFrom: anObject) do:
[:value |
stream
nextPutAll: value;
nextPut: $,].
stream
position: stream position - 1.
stream nextPut: $).
^stream contents
ColumnMap>>columnNames
"Return the column names for my
mapping."
^columnMappings keys
ColumnMap>>valuesFrom: anObject
"Return a collection of the
values of the
instance variables that correspond to my columns."
^self
columnNames collect:
[:key | anObject perform: (columnMappings at: key)]
Image class>>initialize
"Set the class' initial state."
"[Image initialize]"
Smalltalk
at: #ImagePool
put:
IdentityDictionary new.
^self
Image class>>release
"Prepare the class to be deleted."
"[Image release]"
Smalltalk at: #ImagePool put: nil.
Smalltalk
removeKey: #ImagePool.
^self
Image class>>imageCache
"Return the Image caching dictionary."
^ImagePool
Image class>>createSaveIcon
"Create and return the Image for
the Save icon."
^MainMenUI createSaveIcon
Image class>>helpIcon
"Return the Image for the Help icon."
| cacheDictionary |
cacheDictionary := self imageCache.
^cacheDictionary
at: #help
ifAbsent:
[cacheDictionary
at:
#help
put: self createHelpIcon]
Image class>>saveIcon
"Return the Image for the Save icon."
| cacheDictionary |
cacheDictionary := self imageCache.
^cacheDictionary
at: #save
ifAbsent:
[cacheDictionary
at:
#save
put: self createSaveIcon]
Object subclass: #ImageFactory
instanceVariableNames: 'imagePool '
classVariableNames: 'Singleton '
poolDictionaries: ''
ImageFactory class>>initialize
"Set the class' initial state."
"[ImageFactory initialize]"
Singleton := self new.
^self
ImageFactory class>>release
"Prepare the class to be deleted."
"[ImageFactory release]"
Singleton := nil.
^self
ImageFactory class>>default
"Return the class' primary
instance."
^Singleton
ImageFactory>>initialize
"Set the instance's initial state."
imagePool := IdentityDictionary new.
^self
ImageFactory class>>new
"Create and return an instance of the
class."
^self basicNew initialize